2016-11-20 2 views
1

Thisおよびthisはコンパイルされません。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)?が有効閉鎖署名ではありません、あなたは(...)?最も外側削除する必要があります。

パラメータ型を明示的に記述するときは、クロージャ型のパラメータ型と完全に一致する必要があります。したがって、2番目のパラメータの型はNSError?ではなくError?である必要があります。固定上記の二つのことで

、あなたはこのような何か書くことができます。

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

しかし、すべての不要な部分を省略し、あなたがより簡単にそれを書くことができます。ほとんどのケースで

localPlayer.authenticateHandler = {viewController, error in 
    //handle authentication 
} 

->Voidを省略することができます。ほとんどの場合、Swiftはパラメータタイプを推測できます。私は、Swiftがそれらを推論することが決して失敗しないときに型名を省略することを好む。

関連する問題