【发布时间】:2014-06-13 14:36:44
【问题描述】:
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)
}
}
我对这部分很好奇:“(success: Bool!, error: NSError!)”,尤其是感叹号。我对可选项的理解是这样的:
NSError:这是一个 NSError,不能为 nil。 NSError?: 这可能包括一个 NSError 或者它可能是 nil,但它需要首先被解包。 NSError!: 这是一个强制解包的 NSError?,因此不能为 nil。
Facebook 的例子说成功是一个布尔值!并且错误是一个NSError! - 即,它们都是绝对提供的。为什么它们不只是写成 Bool 和 NSError,如果 Facebook 在发送它们之前已经解开它们?另外,如何同时设置成功和错误? NSError 的传统用法是在没有问题的情况下将其设置为 nil。
【问题讨论】:
-
!是一个隐式解包的可选项,其行为完全类似于可选项,只是您可以访问属性,而必须事先解包。不利的一面是,如果你这样做并且它的nil,你会得到一个例外 -
当您看到一个非可选参数 (
!) 时,这正是其名称所暗示的含义:您始终可以假定它是一个有效对象,并且在任何时候都不会是nil你的块被调用了。
标签: swift