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

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

ただいまの
回答率

88.09%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,039

score 11

前提・実現したいこと

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 ->()は型になるのでしょうか?どのようなキーワードで検索したらわかるようになるのでしょうか?

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

こちらの[TWTRTweet]->()[TWTRTweet]という引数を取り何も返さない関数を引数として渡している形になります。
ツイートの取得に成功した場合にはtweets変数(中身は関数)に取得したツイートの配列を渡しています。


キーワードとしてはクロージャー (Closure)トレーリングクロージャ(Trailing Closures)になるでしょうか。
クロージャーについては使い方を含め以前の回答が参考になると思います。

【Swift】クロージャの必要性

今回のコードは若干複雑になっていて、クロージャーを成功、失敗の2つで使用しています。
以下に簡素化してコメントを入れたをコードを載せました、参考にしてみてください。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        APIManager.search(["Key": "Value"], tweets: { (tweet) in

            // tweets:クロージャーが呼ばれた時に実行される
            print(tweet)
            //=> ["Tweet1", "Tweet2", "Tweet3"]

        }) { (error) in

            // error:クロージャーが呼ばれた時に実行される
            print(error)
            //=> Error Domain=Error Code=999 "(null)"
        }
    }
}

// 通信クラス
class APIManager {

    class func search(params: [NSObject : AnyObject]!, tweets: [String] -> (), error: NSError -> () )  {

        // paramsを使用してのツイート取得通信処理
        print(params)

        if /* ツイートが取得成功、失敗のフラグ */ true {

            // ツイートが取得出来た時にツイートを返す
            tweets(["Tweet1", "Tweet2", "Tweet3"])
        } else {

            // ツイートが取得失敗時エラーを返す
            error(NSError(domain: "Error", code: 999, userInfo: nil))
        }
    }
}

更に class func search(params: [NSObject : AnyObject]!, tweets: [String] -> String, error: NSError -> String)の様に返り値をつけると値も戻せます。
※ このパターンは少ないと思いますが、、、

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()


        APIManager.search(["Key": "Value"], tweets: { (tweet) in

            // tweets:クロージャーが呼ばれた時に実行される
            print(tweet)
            //=> ["Tweet1", "Tweet2", "Tweet3"]

            return "成功"

        }) { (error) in

            // error:クロージャーが呼ばれた時に実行される
            print(error)
            //=> Error Domain=Error Code=999 "(null)"

            return "失敗"
        }
    }
}

class APIManager {

    class func search(params: [NSObject : AnyObject]!, tweets: [String] -> String, error: NSError -> String)  {

        // paramsを使用してのツイート取得通信処理
        print(params)

        if /* 通信が成功、失敗のフラグ */ true {
            // ツイートが取得出来た時にツイートを返す
            let value = tweets(["Tweet1", "Tweet2", "Tweet3"])
            print(value)
            //=> 成功

        } else {

            // ツイートが取得失敗時エラーを返す
            let value = error(NSError(domain: "Error", code: 999, userInfo: nil))
            print(value)
            //=> 失敗
        }
    }
}

Playgroundで動かそうとしていた例

func test(myVar: Int -> (), myStr: String -> ()) {
    if /* どちらのクロージャーを呼び出すかを判定 */ true {
        myVar(5)
    } else {
        myStr("test")
    }
}

test({ (myVar) in

    print(myVar)
}) { (myStr) in

    print(myStr)
}

質問の追記

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

APIManager.search(["Key": "Value"], tweets: { (tweet) in print(tweet) }, error: { (error) in print(error) })

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/11 04:05

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

    キャンセル

  • 2016/07/11 07:25 編集

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

    キャンセル

  • 2016/07/12 20:26

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

    キャンセル

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る