优秀的编程知识分享平台

网站首页 > 技术文章 正文

有趣的Swift特性之:多个返回值

nanyue 2025-03-12 19:01:14 技术文章 2 ℃

Swift 允许一个函数返回多个值。或者如果你以一个不同的方式看到它,Swift 函数总是返回一个值,但是那个值可能是一个容易得到的数组。

C 和Objective-C用两种方式支持多值,都不太棒。函数/方法可以返回一个包含多个值的结构体或者类,或者他们可以使用外部参数。返回一个结构体是如此笨重,所以基本上从来不会被使用,除非结构体理论上是一个单独的单位,像frame返回一个NSRect 或者CGRect。外部的参数在Cocoa中用的很多,虽然,特别为了错误句柄而设计。

NSError 类和对应的NSError ** 模式在10.2时代被展现并且快速普及。一些语言抛出异常,Cocoa 把一个NSError * 通过参数传递给调用者来指出错误。像这样的代码是很常见的:

  1. NSError *error;

  2. NSData *data = [NSData dataWithContentsOfFile: file options: 0 error: &error];

  3. if(data == nil) {

  4. // handle error

  5. }

这个将会变得麻烦,并且错误总是可变的,许多代码将会像这样替代:

  1. NSData *data = [NSData dataWithContentsOfFile: file options: 0 error: ];

这有点糟糕,但是有吸引力。

多个返回值显示除了异常和外部指针外的另一个选项。在Python 中,例如,代码将会看起来这样:

  1. data, error = NSData.dataWithContentsOfFile_options_error_(file, 0, None)

  2. ifnot data:

  3. # handle error

因为桥接,这变的有点奇怪,你将会必须要传递NONE作为外部参数,甚至它正被转换成第二个返回值。一个本地的Python调用可能看起来像这样:

  1. data, error = Data.dataWithContentsOfFile(file, 0)

Swift 版本看起来几乎一样的:

  1. let (data, error) = Data.dataWithContentsOfFile(file, 0)

这是一件小事,但是NSError返回在Cocoa 中是很常见的,使一切变得更友好。问题已经足够困扰我,我已经提交preprocessor crimes against humanity,尝试在 Objective-C中构建多返回值,并且我不需要做其他的任何事情。

最近发表
标签列表