【问题标题】:Void return in Objective-C does not translate to Swift 2.0 Error flowObjective-C 中的 void return 不会转换为 Swift 2.0 错误流
【发布时间】:2015-09-21 20:26:06
【问题描述】:

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

例如:

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

迅速:

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

if error != nil {
    // do stuff
}

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

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

}

迅速:

do {
    let aString = try anObject.doSomething()
} catch {
    // stuff
}

这有什么我不明白的地方,还是这只是苹果丢球?前段时间看到帖子提到这个:blog post

【问题讨论】:

  • DocsYou place an ampersand (&) directly before a variable’s name when you pass it as an argument to an inout parameter, to indicate that it can be modified by the function.
  • @ssrobbi:这是一个可能感兴趣的关于错误检查的相关问答:stackoverflow.com/questions/29384218/…
  • 感谢@MartinR,只是需要更严格地遵循可可标准。

标签: ios objective-c swift swift2


【解决方案1】:

根据 Cocoa 约定,通过检查方法是否设置了错误变量来确定方法失败是不正确的。在使用错误变量之前,您必须始终检查方法返回值。来自Error Handling Programming Guide

重要提示:成功或失败由方法的返回值指示。虽然间接返回 Cocoa 错误域中的错误对象的 Cocoa 方法如果通过直接返回 nilNO 指示失败,则保证返回此类对象,但您应始终检查返回值是否为 nil 或 @987654325 @ 在尝试对 NSError 对象执行任何操作之前。

该约定是 Swift 错误处理的基础。在内部,它肯定会检查方法的返回值来决定是否必须跳转到catch 块。

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

【讨论】:

  • That convention is what Swift's error handling is based on. Internally, it must surely be checking the return value of methods to decide whether it must jump to a catch block. 这是有道理的。那么我是否总是返回一个布尔值来表示成功/失败然后符合可可的标准? (并且也会使 do-catch 流程正常工作)
  • 布尔值或对象指针(nil 表示失败),是的。
猜你喜欢
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多