teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

@escaping 要求原因の修正

2020/10/21 06:09

投稿

lehshell
lehshell

スコア1180

answer CHANGED
@@ -29,9 +29,12 @@
29
29
  operation() //プリントします
30
30
  }//もしかしてprintって新規スコープとして取り扱われる?
31
31
  ```
32
- print(operation) では operation を実行していません。
32
+ ~~print(operation) では operation を実行していません。~~
33
- そのため関数のスコープから逃れて実行するまで operation を保持する必要があります。
33
+ ~~そのため関数のスコープから逃れて実行するまで operation を保持する必要があります。~~
34
- したがって @escaping を要求されていますね。
34
+ ~~したがって @escaping を要求されていますね。~~
35
+ beginner_Jiro さんのご指摘通り、print(operation) については XCode 上で確認すると
36
+ Converting non-escaping value to 'Any' may allow it to escape
37
+ というエラーが出ますから直接の原因は Any にキャストされていることですね。
35
38
 
36
39
  10月20日 追記
37
40
  Swift の関数定義は、関数名(引数ラベル 仮引数: 型) { 文 } の構造です。

2

後置クロージャ―の説明漏れを追記

2020/10/21 06:09

投稿

lehshell
lehshell

スコア1180

answer CHANGED
@@ -44,7 +44,7 @@
44
44
  print("プリントします")
45
45
  }
46
46
  ```
47
- は省略した書き方になります。
47
+ 後置クロージャ―を使用し、省略したクロージャーの書き方になります。
48
48
 
49
49
  今回の関数定義と関数呼び出しを省略せずに書くと
50
50
  ```Swift

1

省略しない書き方を追記

2020/10/20 02:47

投稿

lehshell
lehshell

スコア1180

answer CHANGED
@@ -31,4 +31,34 @@
31
31
  ```
32
32
  print(operation) では operation を実行していません。
33
33
  そのため関数のスコープから逃れて実行するまで operation を保持する必要があります。
34
- したがって @escaping を要求されていますね。
34
+ したがって @escaping を要求されていますね。
35
+
36
+ 10月20日 追記
37
+ Swift の関数定義は、関数名(引数ラベル 仮引数: 型) { 文 } の構造です。
38
+ 引数ラベルがない場合は、仮引数が引数ラベルを兼ねる。
39
+ 引数ラベルが _ の場合は関数呼び出し側では引数ラベルを省略できます。
40
+ 関数呼び出しは、関数名(引数ラベル: 実引数) の構造です。
41
+ クロージャー式は {(仮引数: 型) -> 型 in 文} の構造です。
42
+ ```Swift
43
+ executetwice() {
44
+ print("プリントします")
45
+ }
46
+ ```
47
+ は省略した書き方になります。
48
+
49
+ 今回の関数定義と関数呼び出しを省略せずに書くと
50
+ ```Swift
51
+ func executetwice(ope operation: () -> Void) {
52
+ operation() //プリントします
53
+ }
54
+ executetwice(ope: { () -> Void in
55
+ print("プリントします")
56
+ })
57
+ ```
58
+ となります。
59
+ また、クロージャー式をいったん変数に入れて使用すると
60
+ ```Swift
61
+ var prn = {() -> Void in print("プリントします")}
62
+ executetwice(ope: prn)
63
+ ```
64
+ と書くことになります。