いつもお世話になっております。
Swiftの基本的な部分について現在学習中なのですが以下の点についてどなたかご教授願えませんでしょうか。
疑問点
①関数にて引数にクロージャー式を持つ場合の構文について
関数が引数にクロージャー式を受け取る場合に、ブロック内で引数として受け取った式を実行するコードにて不明点がございます。
関数を実行する際に、関数名(){引数として渡すクロージャーの式}と記述するのがいまいちイメージがつかないです。関数({引数として渡すクロージャーの式})とするならばイメージがつくのですが、前者の場合引数はなしと関数を呼び出しているようにしか思えません、、、。そもそも関数()のこの()の部分に引数として渡したい値を記載するという認識自体が間違えているのでしょうか。具体的なコードを下記に記載いたします。
②クロージャー式のエスケープ属性について
まず、エスケープ属性の自身の認識として、関数の引数がクロージャーの場合に、そのクロージャー式が関数のスコープ外で使用されることが想定される場合に付与する属性である。という認識です。
しかしながら、ブロック内で引数内に関数が代入されていることを確認するためにPrint文を記載すると、escape属性を付与する旨のコンパイルエラーが発生いたします。同様に具体的なコードを下記に記載いたします。
コード
①の疑問点の具体的なコード
Swift
1func executetwice(operation: () -> Void) { 2 operation() //プリントします 3} 4//関数呼び出し 5executetwice() { 6 print("プリントします") 7} 8//なぜ関数呼び出し箇所は下記のような書き方ではないのか。。。?これはコンパイルエラー 9//Missing argument label 'operation:' in call 10executetwice( { 11 print("プリントします") 12})
②の疑問点の具体的なコード
Swift
1func executetwice(operation:@escaping () -> Void) { 2//なぜ引数であるoperationの中身がクロージャーであることを確認するために下記のプリント文でエスケープ属性が必要なのか?(スコープ内なのに...) 3 print(operation) 4 operation() //プリントします 5}//もしかしてprintって新規スコープとして取り扱われる? 6 7//関数呼び出し 8executetwice() { 9 print("プリントします") 10} 11
以上となります。それぞれ自身の認識を記載しているのは、間違った認識の場合ご指摘願えたら幸いと思い記載いたしました。
冗長な文章となり申し訳ございませんが何卒ご説明・ご教授いただける方がおりましたらご回答いただきますようよろしくお願いいたします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/21 02:43
2020/10/21 02:52
2020/10/21 04:35
2020/10/21 04:51
2020/10/21 05:47