回答編集履歴

8

修正

2016/07/10 23:50

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -282,7 +282,9 @@
282
282
 
283
283
 
284
284
 
285
- 上記の書き方は`トレーリングクロージャ(Trailing Closures)`と言って最後の引数がクロージャーだった場合に、クロージャーを`かっこ()`の外に記述できるというものですなので`トレーリングクロージャ`を使用しない場合、以下の様に記述できます。
285
+ 上記の書き方は`トレーリングクロージャ(Trailing Closures)`と言って最後の引数がクロージャーだった場合に、クロージャーを`かっこ()`の外に記述できるというものですなので`トレーリングクロージャ`を使用しない場合、以下の様に記述できます。
286
+
287
+ 引数がクロージャー1つの場合は`かっこ()`を省略できます。
286
288
 
287
289
  ※ 今回のパターンはクロージャーが2つあるのでスッキリ見えませんが、1つの場合は見通しがよくなります。
288
290
 

7

修正

2016/07/10 23:50

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -276,4 +276,20 @@
276
276
 
277
277
 
278
278
 
279
-
279
+ 質問の追記
280
+
281
+ ---
282
+
283
+
284
+
285
+ 上記の書き方は`トレーリングクロージャ(Trailing Closures)`と言って最後の引数がクロージャーだった場合に、クロージャーを`かっこ()`の外に記述できるというものですなのでの`トレーリングクロージャ`を使用しない場合、以下の様に記述できます。
286
+
287
+ ※ 今回のパターンはクロージャーが2つあるのでスッキリ見えませんが、1つの場合は見通しがよくなります。
288
+
289
+
290
+
291
+ ```swift
292
+
293
+ APIManager.search(["Key": "Value"], tweets: { (tweet) in print(tweet) }, error: { (error) in print(error) })
294
+
295
+ ```

6

修正

2016/07/10 22:23

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  こちらの`[TWTRTweet]->()`は`[TWTRTweet]`という引数を取り何も返さない関数を引数として渡している形になります。
10
10
 
11
- ツイートの取得に成功した場合には`tweets`変数(中身は関数)取得したツイートの配列を渡しています。
11
+ ツイートの取得に成功した場合には`tweets`変数(中身は関数)取得したツイートの配列を渡しています。
12
12
 
13
13
 
14
14
 

5

修正

2016/07/10 12:32

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -1,3 +1,21 @@
1
+ > tweets: [TWTRTweet]->()が何を指しているのか
2
+
3
+ 何が戻ってくるのかがわからず、何がわかればわかるようになるのかもわかりません。
4
+
5
+ ->()で帰ってくるものは何になるのか、ヒントだけでもいただけないでしょうか?
6
+
7
+
8
+
9
+ こちらの`[TWTRTweet]->()`は`[TWTRTweet]`という引数を取り何も返さない関数を引数として渡している形になります。
10
+
11
+ ツイートの取得に成功した場合には`tweets`変数に(中身は関数)取得したツイートの配列を渡しています。
12
+
13
+
14
+
15
+ ---
16
+
17
+
18
+
1
19
  キーワードとしては`クロージャー (Closure)`、`トレーリングクロージャ(Trailing Closures)`になるでしょうか。
2
20
 
3
21
  クロージャーについては使い方を含め以前の回答が参考になると思います。
@@ -8,7 +26,7 @@
8
26
 
9
27
 
10
28
 
11
- 今回のコードは若干複雑になっていますが、`クロージャー`を成功、失敗の2つ使用しています。
29
+ 今回のコードは若干複雑になってい、`クロージャー`を成功、失敗の2つ使用しています。
12
30
 
13
31
  以下に簡素化してコメントを入れたをコードを載せました、参考にしてみてください。
14
32
 
@@ -259,5 +277,3 @@
259
277
 
260
278
 
261
279
 
262
-
263
-

4

修正

2016/07/10 12:31

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -218,34 +218,46 @@
218
218
 
219
219
 
220
220
 
221
-
221
+ Playgroundで動かそうとしていた例
222
+
223
+
224
+
222
-
225
+ ```swift
226
+
223
-
227
+ func test(myVar: Int -> (), myStr: String -> ()) {
228
+
224
-
229
+ if /* どちらのクロージャーを呼び出すかを判定 */ true {
230
+
225
-
231
+ myVar(5)
232
+
226
-
233
+ } else {
234
+
227
-
235
+ myStr("test")
236
+
228
-
237
+ }
238
+
229
-
239
+ }
240
+
241
+
242
+
230
-
243
+ test({ (myVar) in
244
+
245
+
246
+
231
-
247
+ print(myVar)
248
+
232
-
249
+ }) { (myStr) in
250
+
251
+
252
+
233
-
253
+ print(myStr)
254
+
234
-
255
+ }
256
+
235
-
257
+ ```
236
-
237
-
238
-
239
-
240
-
241
-
242
-
243
-
244
-
245
-
246
-
247
-
248
-
249
-
250
-
251
-
258
+
259
+
260
+
261
+
262
+
263
+

3

修正

2016/07/10 12:15

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -99,3 +99,153 @@
99
99
  }
100
100
 
101
101
  ```
102
+
103
+
104
+
105
+ 更に `class func search(params: [NSObject : AnyObject]!, tweets: [String] -> String, error: NSError -> String)`の様に返り値をつけると値も戻せます。
106
+
107
+ ※ このパターンは少ないと思いますが、、、
108
+
109
+
110
+
111
+ ```swift
112
+
113
+
114
+
115
+ import UIKit
116
+
117
+
118
+
119
+ class ViewController: UIViewController {
120
+
121
+
122
+
123
+ @IBOutlet weak var imageView: UIImageView!
124
+
125
+
126
+
127
+ override func viewDidLoad() {
128
+
129
+ super.viewDidLoad()
130
+
131
+
132
+
133
+
134
+
135
+ APIManager.search(["Key": "Value"], tweets: { (tweet) in
136
+
137
+
138
+
139
+ // tweets:クロージャーが呼ばれた時に実行される
140
+
141
+ print(tweet)
142
+
143
+ //=> ["Tweet1", "Tweet2", "Tweet3"]
144
+
145
+
146
+
147
+ return "成功"
148
+
149
+
150
+
151
+ }) { (error) in
152
+
153
+
154
+
155
+ // error:クロージャーが呼ばれた時に実行される
156
+
157
+ print(error)
158
+
159
+ //=> Error Domain=Error Code=999 "(null)"
160
+
161
+
162
+
163
+ return "失敗"
164
+
165
+ }
166
+
167
+ }
168
+
169
+ }
170
+
171
+
172
+
173
+ class APIManager {
174
+
175
+
176
+
177
+ class func search(params: [NSObject : AnyObject]!, tweets: [String] -> String, error: NSError -> String) {
178
+
179
+
180
+
181
+ // paramsを使用してのツイート取得通信処理
182
+
183
+ print(params)
184
+
185
+
186
+
187
+ if /* 通信が成功、失敗のフラグ */ true {
188
+
189
+ // ツイートが取得出来た時にツイートを返す
190
+
191
+ let value = tweets(["Tweet1", "Tweet2", "Tweet3"])
192
+
193
+ print(value)
194
+
195
+ //=> 成功
196
+
197
+
198
+
199
+ } else {
200
+
201
+
202
+
203
+ // ツイートが取得失敗時エラーを返す
204
+
205
+ let value = error(NSError(domain: "Error", code: 999, userInfo: nil))
206
+
207
+ print(value)
208
+
209
+ //=> 失敗
210
+
211
+ }
212
+
213
+ }
214
+
215
+ }
216
+
217
+ ```
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+

2

修正

2016/07/10 11:56

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
 
78
78
 
79
- if /* 通信が成功、失敗のフラグ */ true {
79
+ if /* ツイート取得成功、失敗のフラグ */ true {
80
80
 
81
81
 
82
82
 

1

修正

2016/07/10 11:46

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -8,7 +8,9 @@
8
8
 
9
9
 
10
10
 
11
- 今回のコードは若干複雑にはなっていますが、`クロージャー`を使用しています、以下に簡単にしてコメントを入れたコードを載せました参考にしてみてください
11
+ 今回のコードは若干複雑にはなっていますが、`クロージャー`を成功、失敗の2つ使用しています。
12
+
13
+ 以下に簡素化してコメントを入れたをコードを載せました、参考にしてみてください。
12
14
 
13
15
 
14
16