【问题标题】:Closure not compiling when setting GKLocalPlayer's authenticateHandler property - Swift 3.0设置 GKLocalPlayer 的 authenticateHandler 属性时关闭不编译 - Swift 3.0
【发布时间】:2016-11-20 03:08:35
【问题描述】:

Thisthis 不编译。

我的 SpriteKitSceneViewController 中的代码,

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

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

认证的属性定义为:

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

我已经阅读了关于闭包的文档,但是我没有找到关于可选闭包的任何内容。我考虑过使用一个函数,但我也无法让它工作。如何编译?

【问题讨论】:

    标签: swift


    【解决方案1】:

    您需要在closure-expression 的顶部写上closure-signature。 (这是有条件的可选。)

    在您的代码中((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 永远无法推断它们时,我更喜欢省略类型注释。

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 2023-02-01
      • 2019-04-29
      • 1970-01-01
      • 2019-06-22
      • 2018-10-08
      • 2015-02-18
      • 1970-01-01
      • 2017-05-16
      相关资源
      最近更新 更多