sicaworks blog

制作したiOSアプリやswiftについて

twitter公式fabricでjsonからツイートのデータを取り込む(swift)

まったくの初心者なのですが、一人こつこつとiOSアプリを作っています。いまはツイッターを使ったアプリを作成し始めたところで、ツイッターの扱い方をあれこれと試しています。


アプリなどでツイッターを扱うにはfabricというtwitter公式のクライアントが用意されています。fabricの導入方法などは他のブログなどでよく紹介されていて特にむつかしいものでもありません。
Fabric - Twitter's Mobile Development Platform


今回これを使っていてjsonからツイートを取り出す部分でハマり、解決するのに時間がかかったのでそのあたりまでを残しておきたいと思います。

検索の条件をつけてjsonを取得する

twitterのsearchAPIを使って、様々なパラメータをつけてリクエストを送るとjsonの形でツイートを取得することができます。全体的には次のような感じで、searchAPIにリクエストを送り、jsonで受け取り、jsonをTWTRTweetクラスのArrayに格納しています。

let client = TWTRAPIClient()
let statusesShowEndpoint = "https://api.twitter.com/1.1/search/tweets.json"
let params = ["q": "天気", "lang": "ja", "count": "3"]
var clientError : NSError?

let request = client.URLRequestWithMethod("GET", URL: statusesShowEndpoint, parameters: params, error: &clientError)
client.sendTwitterRequest(request) { (response, data, connectionError) -> Void in
    if connectionError != nil {
        print("Error: \(connectionError)")
    }
    
    do {
        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! NSDictionary
        print("json: \(json)")
        if let statuses = json["statuses"] as? NSArray {
            let twArray = TWTRTweet.tweetsWithJSONArray(statuses as [AnyObject]) as! [TWTRTweet]
            print(twArray)
        }
    } catch let jsonError as NSError {
        print("json error: \(jsonError.localizedDescription)")
    }
}


パラメータはDictionaryになっていて、ここに必要なものを追加します。

let params = ["q": "天気", "lang": "ja", "count": "3"]

GET search/tweets | Twitter Developers


次の、jsonからのデータの取り出しでハマりました。

//  間違い
let json = NSJSONSerialization.JSONObjectWithData(data!, options: []) as! NSDictionary
let twArray = TWTRTweet.tweetsWithJSONArray(json) as! [TWTRTweet]

//  正解
let json = NSJSONSerialization.JSONObjectWithData(data!, options: []) as! NSDictionary
let twArray = TWTRTweet.tweetsWithJSONArray(json["statuses"] as! [AnyObject]) as! [TWTRTweet]

他のブログだと間違い例のような感じでjsonからツイートを格納していたのですが、ここがうまくいきませんでした。searchAPIで返ってくるjsonはDictionaryタイプのものでArrayタイプではありませんでした。それをそのままtweetsWithJSONArrayに入れていたのでうまくいかずエラーがでまくったのでした。


原因は簡単で、jsonの構造をよく理解していなかったからで、なんと表現したらいいかわかりませんがツイートがArrayとして表示されている部分(json["statuses"])をまず取り出してからtweetsWithJSONArrayにつっこめばよかっただけでした。ただ、なぜかこの部分が書かれていないブログがほとんどで、twitterの公式ドキュメントにもそのような記載はありませんでした。


各ツイートはTWTRTweetクラスに格納されます。このクラスはTwitterKit.frameworkにあらかじめ用意されていたもので、ツイートに関する様々なプロパティが設定されています。あとはこのツイートが並んだArrayをTableViewなどにつっこんだりして表示していくわけです。