私はコードをXcode 8.0ベータ6に更新しましたが、エスケープしない新しいクロージャーのデフォルトのように見えるので行き詰まりました。次のコードでは、Xcodeは以下のコードの最初の行の@escaping
前に追加することを提案しcompletion:
ていますが、それでもコンパイルされず、円で囲みます。*
(編集:実際、Xcodeが示唆するように、@ escapingはの後 completion:
に追加する必要があります。アラートは引き続き表示される可能性がありますが、クリーニングとコンパイルにより削除されます。)*更新されたSwift 3で動作するように、このコードをどのように書き換え/修正する必要がありますか? ?新しいマニュアルを確認しましたが、適切なコードサンプルが見つかりませんでした。
func doSomething(withParameter parameter: Int, completion: () -> ()) {
// Does something
callSomeOtherFunc(withCompletion: completion)
}
// Calling the method and execute closure
doSomething(withParameter: 2) {
// do things in closure
}
どんな助けも大歓迎です!
Swift 3より前は、クロージャ属性@autoclosure
と@noescape
クロージャパラメータの属性でしたが、現在はパラメータタイプの属性です。次の受け入れられたSwift進化の提案を参照してください。
@escaping
受け入れられたSwiftの進化の提案で説明されているように、特定の質問はパラメータータイプ属性(同じ新しいルールが適用される)に関係し、デフォルトでクロージャーパラメーターをエスケープしないようにします。
これらの提案はどちらもXcode 8のベータ段階で実装されています(Xcode 8ベータ6のリリースノートを参照してください。アクセスには開発者アカウントのログインが必要です)
Xcode 8ベータ6の新機能-Swiftコンパイラ:Swift言語
クロージャーパラメーターは、明示的にで注釈されるのではなく、デフォルトでエスケープされません
@noescape
。@escaping
クロージャパラメータがエスケープする可能性があることを示すために使用します。@autoclosure(escaping)
現在はと表記されてい@autoclosure @escaping
ます。アノテーション@noescape
と@autoclosure(escaping)
は非推奨です。(SE-0103)...
Xcode 8ベータの新機能– SwiftおよびApple LLVMコンパイラ:Swift言語
@noescape
そして@autoclosure
、属性になりましパラメータの型の前の代わりに、パラメータ名の前に記述する必要があります。[SE-0049]
したがって、@escaping
次のようにデフォルト以外の属性を使用します。パラメータ自体ではなく、クロージャパラメータのタイプに適用されます
func doSomething(withParameter parameter: Int, completion: @escaping () -> ()) {
// ...
}
(コメントはSOの永続的なデータではないため、下の賛成コメントに質問への私の回答を含めます)
@Cristi Băluță:「エスケープは何をしますか?swift3自動変換の前にこのキーワードを見たことはありません...」
たとえば、上記のSE-0103進化提案へのリンク(およびベータ6リリースノートからの引用テキスト)を参照してください。以前は、クロージャーパラメーターはデフォルトでエスケープされていました(そのため、エスケープするための明示的なアノテーションが存在する必要はありません)。デフォルトでは、代わりにエスケープしないようになりました。したがって、@escaping
クロージャーパラメーターがエスケープする可能性があることを明示的に注釈するの追加(デフォルトの動作とは逆)。これは、@noescape
が非推奨になった理由も説明します(デフォルトの動作に注釈を付ける必要はありません)。
クロージャーパラメーターがエスケープしていることの意味を説明するために、言語リファレンス-属性を引用します。
「この属性をメソッドまたは関数の宣言のパラメーターの型に適用して、後で実行するためにパラメーターの値を保存できることを示します。これは、値が呼び出しの存続期間より長く存続できることを意味します。」
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加