设置GKLocalPlayer的authenticateHandler属性时,关闭不编译 - Swift 3.0

时间:2016-11-20 03:08:36

标签: swift

Thisthis无法编译。

我的SpriteKitSceneViewController中的代码,

var localPlayer = GKLocalPlayer.localPlayer()
localPlayer.authenticateHandler = {((viewController : UIViewController?, error : NSError?) -> Void)? in
//handle authentication
}

产生这些错误:
一行上的连续陈述必须用';'分隔 预期表达

经过身份验证的属性定义为:

var authenticateHandler: ((UIViewController?, Error?) -> Void)? { get set }

我已经阅读了有关闭包的文档,但我没有在可选闭包上找到任何内容。我考虑过使用一个函数,但我也无法使用它。我该怎么做这个编译?

1 个答案:

答案 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永远不会推断它们时,我更喜欢省略类型注释。