强迫展开vs不

Fiz*_*uzz 7 swift

Facebook最近更新了Parse以支持Swift.它给出的代码示例之一是:

var gameScore = PFObject(className: "GameScore")
gameScore.setObject(1337, forKey: "score")
gameScore.setObject("Sean Plott", forKey: "playerName")
gameScore.saveInBackgroundWithBlock { 
(success: Bool!, error: NSError!) -> Void in
    if success {
        NSLog("Object created with id: \(gameScore.objectId)")
    } else {
        NSLog("%@", error)
    }
}
Run Code Online (Sandbox Code Playgroud)

我对这部分感到好奇:"(成功:Bool!,错误:NSError!)",特别是惊叹号.我对选项的理解是这样的:

NSError:这是一个NSError,不能为nil.NSError?:这可能包含NSError或者它可能是nil,但它需要先解包.NSError!:这是一个强制解包的NSError ?,因此不能为零.

Facebook的例子说成功是Bool!和错误是一个NSError! - 即,它们都是明确提供的.为什么他们不仅仅是作为Bool和NSError编写的,只要Facebook在发送它们之前解包它们?此外,如何设置成功和错误?传统使用NSError会说当没有问题时它会设置为nil.

Gab*_*lla 4

这可能是由于与 Objective-C API 的互操作性。由于任何对象都可以nil在 Objective-C 中,因此这两个值在 Swift 中必须是可选的。

无论如何 - 因为显然他们保证这些对象永远不会nil- 他们可以隐式地解开它们,允许任何使用此 API 的人保存一些解开,这很好。

关于你的发言

传统用法NSError会说,当没有问题时,它被设置为 nil。

即使在 Objective-C 中,这也是错误的。

Cocoa 中的BOOL/NSError模式规定您必须检查该success值以了解是否发生了错误,并且 - 如果是这种情况 - 那么NSError将包含有关它的信息。

检查 to NSErrorbenil是这种模式的常见误用,它可能会导致代码中出现逻辑错误,因为某些 Apple APInil即使成功也会返回非错误。

  • @FizzBu​​zz,将_错误_想象为不是错误,而更像是_状态报告_。“成功”报告也是一个报告,逻辑上与“错误”或“警告”相同。“成功”报告通常为零(“0”)_错误代码_,这是完全有效的错误_无错误_。 (2认同)