LoginSignup
88

More than 5 years have passed since last update.

swiftへの移行:pchファイルの設定とmacro

Last updated at Posted at 2014-10-12

はじめに

開発中とストアに公開時の設定を変更したいGAのトラッキング IDアプリが接続するWebサーバのURL
といったものはビルド時のスキーマを複数個用意して、build、archiveなどを変えることでも変更していました。
他にもmacroでLogの出力をON/OFFをしたりもあります。

:[プロジェクト名]-prefix.pch
#ifdef DEBUG
#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define DLog(...)
#endif

swiftはpchがないって、困りました。

参考

iOS開発でのNSLogはDEBUGマクロで使おう
http://d.hatena.ne.jp/k2_k_hei/20120511/1336750473

pchファイルの代替

pchファイルの追加も可能だったかと思いますが、swiftらしく対応してみます。

Appleいわくは

swiftでmacro組むためにCやobjective-cを用いるのはナンセンス

Preprocessor Directivesあたりに記述があります。

対象によってはUtilクラスのクラスメソッドにするのが正しいのかもしれませんが、コードの移行を考えると難しいところもあります。

参考URL

設定の変更

buildターゲットを変えることでパラメータの設定値を変更します

functions.swift
#if DEBUG
    let kSETTING_PARAM:String = "DEBUG"
#elseif DEBUG_STAGING
    let kSETTING_PARAM:String = "DEBUG_STAGE"
#elseif RELEASE_STAGING
    let kSETTING_PARAM:String = "RELEASE_STAGE"
#else
    let kSETTING_PARAM:String = "RELEASE"
#endif

macroの代替

functions.swift
func Log(message: String,
    function: String = __FUNCTION__,
    file: String = __FILE__,
    line: Int = __LINE__) {
        #if DEBUG
            println("INPUT \"\(message)\" (File: \(file), Function: \(function), Line: \(line))")
        #elseif DEBUG_STAGING
            println("INPUT \(message)")
        #else
        #endif

}

 func LogWithTime(message: String,
    function: String = __FUNCTION__,
    file: String = __FILE__,
    line: Int = __LINE__) {
        let now = NSDate()
        let dateFormatter = NSDateFormatter()
        dateFormatter.timeStyle = .MediumStyle
        dateFormatter.dateStyle = .MediumStyle

        println("\(dateFormatter.stringFromDate(now)) Message \"\(message)\" (File: \(file), Function: \(function), Line: \(line))")
}

プロジェクトファイルの設定

先に書いたpchの代替を有効にするためには、プロジェクトファイル側に設定が必要です。

Configulationの追加

(1)+を押します
スクリーンショット 2014-10-12 22.44.45.png

(2)Configurationを複製
実機転送などのデバッグの場合はDebugを複製し、adhocを作る場合などはReleaseから複製します

スクリーンショット 2014-10-12 22.52.26.png

Swift Compliler - Custom Flagの設定

各Configurationを識別するパラメータの頭に-Dをつけて設定します。

-DDEBUGなど
スクリーンショット 2014-10-12 23.02.28.png

Build Setting の追加

(1)複製します
スクリーンショット 2014-10-12 23.08.04.png

(2)Duplicate Onlyを選択

スクリーンショット 2014-10-12 23.08.14.png

(3)複製したBuild Settingでcopyと検索
適当な名前でplistが作られていたり、Product Nameが入っているので変更します。

スクリーンショット 2014-10-12 23.48.21.png

Product Nameの変更
スクリーンショット 2014-10-12 23.48.57.png

plistの変更
スクリーンショット 2014-10-12 23.49.33.png

Targetsの表示部分の変更
スクリーンショット 2014-10-12 23.51.24.png

Schemeの設定

(1)Manage Schemes...を選択

スクリーンショット 2014-10-12 23.16.50.png

(2)Scheme名を変更

スクリーンショット 2014-10-13 0.11.21.png

(3)Configurationを設定

スクリーンショット 2014-10-12 23.39.20.png

実行してみる

スキーマを変更して、それぞれのConfigurationの設定が有効になっているかを確認します

スクリーンショット 2014-10-13 1.03.33.png

DEBUG

スクリーンショット 2014-10-13 1.14.56.png

DEBUGの複製Setting

スクリーンショット 2014-10-13 1.13.45.png

RELEASEの複製Setting

スクリーンショット 2014-10-13 1.14.22.png

結果を見て書き換え

functions.swift
func Log(message: String,
    function: String = __FUNCTION__,
    file: String = __FILE__,
    line: Int = __LINE__) {
    #if DEBUG
        println("INPUT \"\(message)\" (File: \(file), Function: \(function), Line: \(line))")
    #elseif DEBUG_STAGING || RELEASE_STAGING
        println("INPUT \(message)")
    #else
        //RELEASEの時は出力しない
    #endif

}

参考URL

Transitioning from Objective-C to Swift
http://b2cloud.com.au/tutorial/transitioning-from-objective-c-to-swift/

NSLog デバッグ用の各種ログマクロまとめ
http://qiita.com/yusuga_/items/3751cf2a0b0dbf2eefd8

In absence of preprocessor macros, is there a way to define practical scheme specific flags at project level in Xcode project
http://stackoverflow.com/questions/24111854/in-absence-of-preprocessor-macros-is-there-a-way-to-define-practical-scheme-spe/24112024#24112024

さいごに

swiftになって自動で移行ができず、人力でないと捗らないものが他にもたくさんあります。
言語レベルの仕様変更もまだ油断できません。
先人のTipsありきの手探りでたどり着くことがまだ多いです。
出来ることと、正しい手法かは実際にやってみた方や、知見のある詳しい方からの情報がもっと必要です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
88