tweets: [TWTRTweet]->()が何を指しているのか
何が戻ってくるのかがわからず、何がわかればわかるようになるのかもわかりません。
->()で帰ってくるものは何になるのか、ヒントだけでもいただけないでしょうか?
こちらの[TWTRTweet]->()
は[TWTRTweet]
という引数を取り何も返さない関数を引数として渡している形になります。
ツイートの取得に成功した場合にはtweets
変数(中身は関数)に取得したツイートの配列を渡しています。
キーワードとしてはクロージャー (Closure)
、トレーリングクロージャ(Trailing Closures)
になるでしょうか。
クロージャーについては使い方を含め以前の回答が参考になると思います。
【Swift】クロージャの必要性
今回のコードは若干複雑になっていて、クロージャー
を成功、失敗の2つで使用しています。
以下に簡素化してコメントを入れたをコードを載せました、参考にしてみてください。
swift
1import UIKit
2
3class ViewController: UIViewController {
4
5 override func viewDidLoad() {
6 super.viewDidLoad()
7
8 APIManager.search(["Key": "Value"], tweets: { (tweet) in
9
10 // tweets:クロージャーが呼ばれた時に実行される
11 print(tweet)
12 //=> ["Tweet1", "Tweet2", "Tweet3"]
13
14 }) { (error) in
15
16 // error:クロージャーが呼ばれた時に実行される
17 print(error)
18 //=> Error Domain=Error Code=999 "(null)"
19 }
20 }
21}
22
23// 通信クラス
24class APIManager {
25
26 class func search(params: [NSObject : AnyObject]!, tweets: [String] -> (), error: NSError -> () ) {
27
28 // paramsを使用してのツイート取得通信処理
29 print(params)
30
31 if /* ツイートが取得成功、失敗のフラグ */ true {
32
33 // ツイートが取得出来た時にツイートを返す
34 tweets(["Tweet1", "Tweet2", "Tweet3"])
35 } else {
36
37 // ツイートが取得失敗時エラーを返す
38 error(NSError(domain: "Error", code: 999, userInfo: nil))
39 }
40 }
41}
更に class func search(params: [NSObject : AnyObject]!, tweets: [String] -> String, error: NSError -> String)
の様に返り値をつけると値も戻せます。
※ このパターンは少ないと思いますが、、、
swift
1
2import UIKit
3
4class ViewController: UIViewController {
5
6 @IBOutlet weak var imageView: UIImageView!
7
8 override func viewDidLoad() {
9 super.viewDidLoad()
10
11
12 APIManager.search(["Key": "Value"], tweets: { (tweet) in
13
14 // tweets:クロージャーが呼ばれた時に実行される
15 print(tweet)
16 //=> ["Tweet1", "Tweet2", "Tweet3"]
17
18 return "成功"
19
20 }) { (error) in
21
22 // error:クロージャーが呼ばれた時に実行される
23 print(error)
24 //=> Error Domain=Error Code=999 "(null)"
25
26 return "失敗"
27 }
28 }
29}
30
31class APIManager {
32
33 class func search(params: [NSObject : AnyObject]!, tweets: [String] -> String, error: NSError -> String) {
34
35 // paramsを使用してのツイート取得通信処理
36 print(params)
37
38 if /* 通信が成功、失敗のフラグ */ true {
39 // ツイートが取得出来た時にツイートを返す
40 let value = tweets(["Tweet1", "Tweet2", "Tweet3"])
41 print(value)
42 //=> 成功
43
44 } else {
45
46 // ツイートが取得失敗時エラーを返す
47 let value = error(NSError(domain: "Error", code: 999, userInfo: nil))
48 print(value)
49 //=> 失敗
50 }
51 }
52}
Playgroundで動かそうとしていた例
swift
1func test(myVar: Int -> (), myStr: String -> ()) {
2 if /* どちらのクロージャーを呼び出すかを判定 */ true {
3 myVar(5)
4 } else {
5 myStr("test")
6 }
7}
8
9test({ (myVar) in
10
11 print(myVar)
12}) { (myStr) in
13
14 print(myStr)
15}
質問の追記
上記の書き方はトレーリングクロージャ(Trailing Closures)
と言って最後の引数がクロージャーだった場合に、クロージャーをかっこ()
の外に記述できるというものですなのでトレーリングクロージャ
を使用しない場合、以下の様に記述できます。
引数がクロージャー1つの場合はかっこ()
を省略できます。
※ 今回のパターンはクロージャーが2つあるのでスッキリ見えませんが、1つの場合は見通しがよくなります。
swift
1APIManager.search(["Key": "Value"], tweets: { (tweet) in print(tweet) }, error: { (error) in print(error) })
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/10 19:05
2016/07/10 22:26 編集
2016/07/12 11:26