Objective-C中的Void返回不会转换为Swift 2.0错误流

0 objective-c ios swift swift2

我注意到如果我创建一个返回void并接受NSError指针的objective-c函数,它将不会转换为swift do-catch错误流,我将不得不像以前一样传入对NSError的引用swift的版本.

例如:

- (void)doSomethingWithError:(NSError **)error {
    // set the error in here
}   
Run Code Online (Sandbox Code Playgroud)

在swift中:

var error: NSError?
anObject.doSomethingWithError(&error)

if error != nil {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

如果我返回一个objective-c对象或bool,它将正确翻译:

- (NSString *)doSomethingWithError:(NSError **)error {

}
Run Code Online (Sandbox Code Playgroud)

在swift中:

do {
    let aString = try anObject.doSomething()
} catch {
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

有什么关于这一点,我不明白,或者这只是苹果丢球?我刚才看到过这篇文章:博客文章

Ken*_*ses 6

通过Cocoa约定,通过检查方法是否设置了错误变量来确定方法失败是不正确的.在使用错误变量之前,必须始终检查方法返回值.从错误处理编程指南:

重要说明:方法的返回值表示成功或失败.虽然Cocoa方法,在可可误差区域间接返回错误的对象是保证返回这样的对象,如果该方法直接返回指示失败nil或者NO,您应经常检查返回值是nilNO试图做的任何事情之前NSError对象.

这个约定是Swift的错误处理基础.在内部,它必须检查方法的返回值,以确定它是否必须跳转到catch块.

你返回的第一个-doSomethingWithError:方法void并不遵循Cocoa的约定,因此Swift没有按照你期望的方式处理它也就不足为奇了.