質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

1471閲覧

クラスメソッドの引数の->()

odekakewaqwaq

総合スコア11

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/07/10 09:53

編集2016/07/10 10:07

###前提・実現したいこと
SwiftでTwitterAPI連携をしたアプリを作りたく
http://www.tejitak.com/blog/?p=1056
を参考に、API呼び出しのコードを書こうと思っているのですが

class func search(params: [NSObject : AnyObject]!, tweets: [TWTRTweet]->(), error: (NSError) -> ()) { self.callAPI("/search/tweets.json", parameters: params, { response, data, err in if err == nil { var jsonError: NSError? let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &jsonError) if let top = json as? NSDictionary { var list: [TWTRTweet] = [] if let statuses = top["statuses"] as? NSArray { list = URLTweet.tweetsWithJSONArray(statuses) as [TWTRTweet] } tweets(list) } } else { error(err) } }) }

の一行目、tweets: [TWTRTweet]->()が何を指しているのか
何が戻ってくるのかがわからず、何がわかればわかるようになるのかもわかりません。
->()で帰ってくるものは何になるのか、ヒントだけでもいただけないでしょうか?

###試したこと
playgroundで

func test (myVar: Int->(),myStr : String->()){ } print(test(5,myStr: "test"))

と打ったのですが
Cannot convert value of type 'Int' to expected argument type 'Int ->()'とエラーが返ってきます。
Int ->()は型になるのでしょうか?どのようなキーワードで検索したらわかるようになるのでしょうか?

以上、何がわからないのかわからない状態で申し訳ありませんが
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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 11:30

編集2016/07/10 23:50
_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

odekakewaqwaq

2016/07/10 19:05

回答ありがとうございます。 一つ目のコードの ``` }) { (error) in ``` の部分がわからないのですが なぜ ``` },error:{(error) in ``` と、ならないのでしょうか ```
_Kentarou

2016/07/10 22:26 編集

回答の一番下に追記しましたが、それがトレーリングクロージャというものです。
odekakewaqwaq

2016/07/12 11:26

すみません。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問