
Swift 允许一个函数返回多个值。或者如果你以一个不同的方式看到它,Swift 函数总是返回一个值,但是那个值可能是一个容易得到的数组。
C 和Objective-C用两种方式支持多值,都不太棒。函数/方法可以返回一个包含多个值的结构体或者类,或者他们可以使用外部参数。返回一个结构体是如此笨重,所以基本上从来不会被使用,除非结构体理论上是一个单独的单位,像frame返回一个NSRect 或者CGRect。外部的参数在Cocoa中用的很多,虽然,特别为了错误句柄而设计。
NSError 类和对应的NSError ** 模式在10.2时代被展现并且快速普及。一些语言抛出异常,Cocoa 把一个NSError * 通过参数传递给调用者来指出错误。像这样的代码是很常见的:
NSError *error;
NSData *data = [NSData dataWithContentsOfFile: file options: 0 error: &error];
if(data == nil) {
// handle error
}
这个将会变得麻烦,并且错误总是可变的,许多代码将会像这样替代:
NSData *data = [NSData dataWithContentsOfFile: file options: 0 error: ];
这有点糟糕,但是有吸引力。
多个返回值显示除了异常和外部指针外的另一个选项。在Python 中,例如,代码将会看起来这样:
data, error = NSData.dataWithContentsOfFile_options_error_(file, 0, None)
ifnot data:
# handle error
因为桥接,这变的有点奇怪,你将会必须要传递NONE作为外部参数,甚至它正被转换成第二个返回值。一个本地的Python调用可能看起来像这样:
data, error = Data.dataWithContentsOfFile(file, 0)
Swift 版本看起来几乎一样的:
let (data, error) = Data.dataWithContentsOfFile(file, 0)
这是一件小事,但是NSError返回在Cocoa 中是很常见的,使一切变得更友好。问题已经足够困扰我,我已经提交preprocessor crimes against humanity,尝试在 Objective-C中构建多返回值,并且我不需要做其他的任何事情。