2016-11-20 33 views
1

Thisthis不能編譯。設置GKLocalPlayer的authenticateHandler屬性時無法編譯時關閉 - Swift 3.0

在我SpriteKitSceneViewController的代碼,

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

產生這些錯誤:
上的線必須被分開連續語句 ';'
預期表達

通過身份驗證的屬性定義爲:

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

我讀過關於關閉的文件,但我沒有找到可選關閉任何東西。我想過使用一個函數來代替,但是我也無法做到這一點。我怎樣才能編譯?

回答

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永遠不會推斷它們時,我更喜歡省略類型註釋。