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)