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

- (void)doSomethingWithError:(NSError **)error {
    // set the error in here
}

斯威夫特:
var error: NSError?
anObject.doSomethingWithError(&error)

if error != nil {
    // do stuff
}

如果我返回一个objective-c对象或bool,它将正确翻译:
- (NSString *)doSomethingWithError:(NSError **)error {

}

斯威夫特:
do {
    let aString = try anObject.doSomething()
} catch {
    // stuff
}

这件事有什么我不明白的,还是这只是苹果丢了球?我刚才看到一个帖子提到这个:blog post

最佳答案

按照Cocoa惯例,通过检查是否设置了错误变量来确定方法失败是不正确的。在使用错误变量之前,必须始终检查方法返回值。从Error Handling Programming Guide开始:
重要提示:方法的返回值表示成功或失败。尽管在Cocoa错误域中间接返回错误对象的Cocoa方法可以保证在方法直接返回nilNO指示失败时返回这些对象,但是在尝试对nil对象执行任何操作之前,您应该始终检查返回值是否为NONSError
这个约定就是Swift错误处理的基础。在内部,它必须检查方法的返回值,以决定是否必须跳转到catch块。
返回值为-doSomethingWithError:的第一个void方法不遵循Cocoa的约定,因此Swift没有按您期望的方式处理它也就不足为奇了。

08-05 21:45
查看更多