Swift 3へのクロージャーの更新-@escaping

非tomatic:

私はコードを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
}

どんな助けも大歓迎です!

dfri:

Swift 3:クロージャーのパラメーター属性は、パラメーター自体ではなく、パラメーターの型に適用されるようになりました

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]

編集
0

コメントを追加

0

関連記事

分類Dev

Swift:@escapingクロージャ付きのセレクターはEXC_BAD_ACCESSを返します

分類Dev

Swift 3:非同期作業なしで@escapingクロージャで強い自己をキャプチャする

分類Dev

Swift @escaping and Completion Handler

分類Dev

Swift 4 @ escapingタイプをパラメーターとして

分類Dev

Swift @escapingおよびCompletion Handler

分類Dev

クロージャーへの侵入を使用する[Swift]

分類Dev

Swiftのマクロクロージャ

分類Dev

Swift @escapingはnull以外の関数引数にのみ適用されますか?

分類Dev

Swift @escapingはnull以外の関数引数にのみ適用されますか?

分類Dev

クロージャーswift3の漏れを防ぐ方法

分類Dev

Swift3のクロージャの省略構文

分類Dev

Objective-CにはSwiftの@escapingアノテーションと同等のものがありますか?

分類Dev

Swiftクロージャの「自己」

分類Dev

Swiftのtypealiasingクロージャ

分類Dev

Realm Swift:クロージャ内のオブジェクトを更新します

分類Dev

Swift3の入れ子関数とクロージャ

分類Dev

クロージャー用のSwift3でのtypealiasの定義

分類Dev

Swift3のエスケープしないクロージャの問題

分類Dev

クロージャーと完了ハンドラーの連鎖 Swift 3

分類Dev

Swiftジェネリッククロージャーの合計

分類Dev

メンバー「print」へのあいまいな参照-(Swiftクロージャ内のスコープ?)

分類Dev

Swift4のオプションのクロージャー

分類Dev

Swiftのifvarクロージャーの範囲

分類Dev

Swift での簡単なクロージャーの例

分類Dev

Swiftのカレークロージャー

分類Dev

Swift 5では、2つのクロージャへのポインタを比較する方法は何ですか?

分類Dev

Pythonで同等のSwiftオプションクロージャー

分類Dev

forループでのSwiftクロージャ

分類Dev

空の値を返す Swift クロージャー

Related 関連記事

  1. 1

    Swift:@escapingクロージャ付きのセレクターはEXC_BAD_ACCESSを返します

  2. 2

    Swift 3:非同期作業なしで@escapingクロージャで強い自己をキャプチャする

  3. 3

    Swift @escaping and Completion Handler

  4. 4

    Swift 4 @ escapingタイプをパラメーターとして

  5. 5

    Swift @escapingおよびCompletion Handler

  6. 6

    クロージャーへの侵入を使用する[Swift]

  7. 7

    Swiftのマクロクロージャ

  8. 8

    Swift @escapingはnull以外の関数引数にのみ適用されますか?

  9. 9

    Swift @escapingはnull以外の関数引数にのみ適用されますか?

  10. 10

    クロージャーswift3の漏れを防ぐ方法

  11. 11

    Swift3のクロージャの省略構文

  12. 12

    Objective-CにはSwiftの@escapingアノテーションと同等のものがありますか?

  13. 13

    Swiftクロージャの「自己」

  14. 14

    Swiftのtypealiasingクロージャ

  15. 15

    Realm Swift:クロージャ内のオブジェクトを更新します

  16. 16

    Swift3の入れ子関数とクロージャ

  17. 17

    クロージャー用のSwift3でのtypealiasの定義

  18. 18

    Swift3のエスケープしないクロージャの問題

  19. 19

    クロージャーと完了ハンドラーの連鎖 Swift 3

  20. 20

    Swiftジェネリッククロージャーの合計

  21. 21

    メンバー「print」へのあいまいな参照-(Swiftクロージャ内のスコープ?)

  22. 22

    Swift4のオプションのクロージャー

  23. 23

    Swiftのifvarクロージャーの範囲

  24. 24

    Swift での簡単なクロージャーの例

  25. 25

    Swiftのカレークロージャー

  26. 26

    Swift 5では、2つのクロージャへのポインタを比較する方法は何ですか?

  27. 27

    Pythonで同等のSwiftオプションクロージャー

  28. 28

    forループでのSwiftクロージャ

  29. 29

    空の値を返す Swift クロージャー

ホットタグ

アーカイブ