読者です 読者をやめる 読者になる 読者になる

info.plistを読むこととif-let-as?

FacebookにアクセスするiOSアプリケーションを作るには、info.plistにFacebook AppIDを書き込まないといけません。このへんはiOS向けのクイックスタートから数ステップでAppIDを取得してのちに、次に何をしなければならないかという説明文に詳しいです。

https://developers.facebook.com/quickstarts/?platform=ios

このAppIDはSocial.FrameworkおよびAccounts.Frameworkを用いる際にコード上必要になります。でも、すでにinfo.plistに書いてるんですよね。AppIDはコロコロ変える性質のものではありませんが、記述はアトミックに一箇所で行った方が様々コード品質的に都合良いでしょうから、このplistから情報取得して使うようにします。UIApplicationDelegateのapplicationメソッドにて情報取得 によるオブジェクトの初期化。

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        if let appID = NSBundle.mainBundle().infoDictionary?["FacebookAppID"] as? String {
            connector = FacebookConnector(appID: appID)
            return true
        } else {
            return false
        }
    }

NSBundle.mainBundle().infoDictionaryで、plistがNSDictionary?として取得できますから、Optinal外して先に書き込んであるキー「FacebookAppID」で値取得すればよい。万が一に取れなかったらアプリケーションを立ち上げないようにすれば、info.plistへの設定漏れが検出できるでしょう。

as?によるGracefulなキャストがいいですね。他の言語では型を調べながらダウンキャストして行かなければならないようなケースがすっきりと書けました。たとえばOptional無しにちょっと前のJava的に書くなら以下のようになるかと思います。

let infoDic = NSBundle.mainBundle().infoDic
if infoDic != nil {
    let obj = infoDic["FacebookAppID"]
    if obj is String {
        let appID = obj as String
        connector = FacebookConnector(appID: appID)
        return true
    }
}
return false

省略できるところ凝りに凝って短く書くと黒魔術みたいになってしまうこともありますが、if-let-as?ぐらいは可読性を高めるのに貢献するのではないでしょうか。ちなみにUIApplicationDelegateはアプリケーション内のどこからでも以下のコードでアクセスできます。

        let delegate = UIApplication.sharedApplication().delegate as AppDelegate

末尾でダウンキャストする型の指定は、自分で作ったアプリケーションのデリゲーション型です。