Objective-C
iOS
Swift

swiftでtwitterアプリを作ったときにハマったこと

More than 3 years have passed since last update.

Swiftを使ってTwitterアプリを作ったときにハマったことをメモに残します。
※自分の備忘録と今後開発してみたいという方の参考になると嬉しいです。

Twitter アプリの作成には、ツイッターアプリを作ろう。誰でもわかるiPhone開発講座を参考にしました。

Twitter.hのインポート

Swiftでは、headerをインクルードする代わりにframeworkをインポートする

// Objective-Cの場合
#include <Twitter/Twitter.h>
// Swiftの場合
import Twitter

ブロックを引数に渡す

// Objective-Cの場合
[accountStore requestAccessToAccountsWithType:twitterAccountType
              withCompletionHandler:^(BOOL granted, NSError *error)
     {
         if (!granted) {
             NSLog(@"ユーザーがアクセスを拒否しました。");
         }else{
             NSLog(@"ユーザーがアクセスを許可しました。");
         }
     }];
// Swiftの場合
// 一度 ACAccountStoreRequestAccessCompletionHandler で handlerを宣言しないとエラーになる
// そのうち調べよう
let handler: ACAccountStoreRequestAccessCompletionHandler =
{granted, error in
    if(!granted) {
        NSLog("ユーザーがアクセスを拒否しました。")
    } else {
        NSLog("ユーザーがアクセスを許可しました。")
    }
}
//
accountStore.requestAccessToAccountsWithType(twitterAccountType, handler)
// Swiftの場合(エラーが発生)
// Could not find an overload for 'requestAccessToAccountsWithType' that accepts the supplied arguments が発生する
accountStore.requestAccessToAccountsWithType(twitterAccountType, {(granted:Bool, error:NSError) in
    if(!granted) {
        NSLog("ユーザーがアクセスを拒否しました。")
    } else {
        NSLog("ユーザーがアクセスを許可しました。")
    }
})

Type Cast

// Objective-Cの場合
ACAccount *account = [twitterAccounts objectAtIndex:0];
// Swiftの場合
let account = twitterAccounts[0] as ACAccount

TWRequest で構文エラー

TWRequestのインスタンスを作成するコードを書いた時にエラーが発生して数時間ハマってしまいました。
Developer Forumsに質問して原因を教えて頂きました。

// Extra argument in callが発生するパターン
let url = NSURL.URLWithString("http://api.twitter.com/1/statuses/home_timeline.json")
let request = TWRequest(url, nil, TWRequestMethodGET) //ERROR

urlという変数名が1つ目の引数と被ってしまったことが問題だったようです。

// Could not find an overload for 'init' that accepts the supplied argumentsが発生するパターン
let url = NSURL.URLWithString("http://api.twitter.com/1/statuses/home_timeline.json")
let request = TWRequest(URL: url, parameters: nil, requestMethod: TWRequestMethodGET) // ERROR

3つ目のパラメータにTWRequestMethodGET を指定したのが問題でした。

これらを踏まえて動くようになったコードです。

let url = NSURL.URLWithString("http://api.twitter.com/1/statuses/home_timeline.json")
et request = TWRequest(URL: url, parameters: nil, requestMethod: TWRequestMethod.GET)