强迫展开vs不

时间:2014-06-13 14:36:44

标签: 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)
    }
}

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

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

Facebook的例子说成功是Bool!和错误是一个NSError! - 即,它们都是明确提供的。为什么他们不会像Bool和NSError那样写,只要Facebook在发送它们之前解包它们?此外,如何设置成功和错误?传统使用NSError会说在没有问题的情况下将其设置为nil。

2 个答案:

答案 0 :(得分:4)

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

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

关于你的陈述

  

传统使用NSError会说在没有问题时它会设置为nil。

即使在Objective-C中也是如此。

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

检查NSError是否NSError是此模式的常见误用,并且可能导致代码中出现逻辑错误,因为某些Apple API会返回非nil错误即使是成功的。

答案 1 :(得分:0)

  

Facebook的例子说成功是Bool!和错误是一个NSError! - 即,它们都是明确提供的。

是的,他们是。请记住,错误代码零(0)通常标记成功的事务,这在逻辑上比发送nil更正确。

  

此外,如何设置成功和错误?传统使用NSError会说在没有问题的情况下将其设置为nil。

告诉您(隐式),如果发生任何错误,error 将为您的块提供作为有效的错误消息。