クラスメソッドの引数の->()
- 評価
- クリップ 0
- VIEW 1,039
前提・実現したいこと
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
tweets: [TWTRTweet]->()が何を指しているのか
何が戻ってくるのかがわからず、何がわかればわかるようになるのかもわかりません。
->()で帰ってくるものは何になるのか、ヒントだけでもいただけないでしょうか?
こちらの[TWTRTweet]->()
は[TWTRTweet]
という引数を取り何も返さない関数を引数として渡している形になります。
ツイートの取得に成功した場合にはtweets
変数(中身は関数)に取得したツイートの配列を渡しています。
キーワードとしてはクロージャー (Closure)
、トレーリングクロージャ(Trailing Closures)
になるでしょうか。
クロージャーについては使い方を含め以前の回答が参考になると思います。
今回のコードは若干複雑になっていて、クロージャー
を成功、失敗の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) })
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/07/11 04:05
一つ目のコードの
```
}) { (error) in
```
の部分がわからないのですが
なぜ
```
},error:{(error) in
```
と、ならないのでしょうか
```
2016/07/11 07:25 編集
2016/07/12 20:26