我的SpriteKitSceneViewController中的代码,
var localPlayer = GKLocalPlayer.localPlayer()
localPlayer.authenticateHandler = {((viewController : UIViewController?, error : NSError?) -> Void)? in
//handle authentication
}
产生这些错误:
一行上的连续陈述必须用';'分隔
预期表达
经过身份验证的属性定义为:
var authenticateHandler: ((UIViewController?, Error?) -> Void)? { get set }
我已经阅读了有关闭包的文档,但我没有在可选闭包上找到任何内容。我考虑过使用一个函数,但我也无法使用它。我该怎么做这个编译?
答案 0 :(得分:1)
您需要在closure-signature的顶部写下closure-expression。 (它有条件可选。)
在您的代码中((viewController : UIViewController?, error : NSError?) -> Void)?
不是有效的封闭式签名,您需要移除最外层的(...)?
。
当您显式编写参数类型时,它们需要与闭包类型的参数类型完全匹配。因此,您的第二个参数类型必须是Error?
,而不是NSError?
。
通过以上两点修复,您可以编写如下内容:
localPlayer.authenticateHandler = {(viewController : UIViewController?, error : Error?) -> Void in
//handle authentication
}
但是省略所有不需要的部分,你可以更容易地写出来:
localPlayer.authenticateHandler = {viewController, error in
//handle authentication
}
在大多数情况下,您可以省略->Void
,几乎在所有情况下,Swift都可以推断出参数类型。当Swift永远不会推断它们时,我更喜欢省略类型注释。