回答編集履歴

3

@escaping 要求原因の修正

2020/10/21 06:09

投稿

lehshell
lehshell

スコア1147

test CHANGED
@@ -60,11 +60,17 @@
60
60
 
61
61
  ```
62
62
 
63
- print(operation) では operation を実行していません。
63
+ ~~print(operation) では operation を実行していません。~~
64
64
 
65
- そのため関数のスコープから逃れて実行するまで operation を保持する必要があります。
65
+ ~~そのため関数のスコープから逃れて実行するまで operation を保持する必要があります。~~
66
66
 
67
- したがって @escaping を要求されていますね。
67
+ ~~したがって @escaping を要求されていますね。~~
68
+
69
+ beginner_Jiro さんのご指摘通り、print(operation) については XCode 上で確認すると
70
+
71
+ Converting non-escaping value to 'Any' may allow it to escape
72
+
73
+ というエラーが出ますから直接の原因は Any にキャストされていることですね。
68
74
 
69
75
 
70
76
 

2

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

2020/10/21 06:09

投稿

lehshell
lehshell

スコア1147

test CHANGED
@@ -90,7 +90,7 @@
90
90
 
91
91
  ```
92
92
 
93
- は省略した書き方になります。
93
+ 後置クロージャ―を使用し、省略したクロージャーの書き方になります。
94
94
 
95
95
 
96
96
 

1

省略しない書き方を追記

2020/10/20 02:47

投稿

lehshell
lehshell

スコア1147

test CHANGED
@@ -65,3 +65,63 @@
65
65
  そのため関数のスコープから逃れて実行するまで operation を保持する必要があります。
66
66
 
67
67
  したがって @escaping を要求されていますね。
68
+
69
+
70
+
71
+ 10月20日 追記
72
+
73
+ Swift の関数定義は、関数名(引数ラベル 仮引数: 型) { 文 } の構造です。
74
+
75
+ 引数ラベルがない場合は、仮引数が引数ラベルを兼ねる。
76
+
77
+ 引数ラベルが _ の場合は関数呼び出し側では引数ラベルを省略できます。
78
+
79
+ 関数呼び出しは、関数名(引数ラベル: 実引数) の構造です。
80
+
81
+ クロージャー式は {(仮引数: 型) -> 型 in 文} の構造です。
82
+
83
+ ```Swift
84
+
85
+ executetwice() {
86
+
87
+ print("プリントします")
88
+
89
+ }
90
+
91
+ ```
92
+
93
+ は省略した書き方になります。
94
+
95
+
96
+
97
+ 今回の関数定義と関数呼び出しを省略せずに書くと
98
+
99
+ ```Swift
100
+
101
+ func executetwice(ope operation: () -> Void) {
102
+
103
+ operation() //プリントします
104
+
105
+ }
106
+
107
+ executetwice(ope: { () -> Void in
108
+
109
+ print("プリントします")
110
+
111
+ })
112
+
113
+ ```
114
+
115
+ となります。
116
+
117
+ また、クロージャー式をいったん変数に入れて使用すると
118
+
119
+ ```Swift
120
+
121
+ var prn = {() -> Void in print("プリントします")}
122
+
123
+ executetwice(ope: prn)
124
+
125
+ ```
126
+
127
+ と書くことになります。