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

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

```c
:[プロジェクト名]-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
https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/InteractingWithCAPIs.html

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

```swift: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の代替
```swift: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の追加

（１）`+`を押します
![スクリーンショット 2014-10-12 22.44.45.png](https://qiita-image-store.s3.amazonaws.com/0/12362/419e2ed7-8d5b-71ed-c8ea-67fe988b1365.png)

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

![スクリーンショット 2014-10-12 22.52.26.png](https://qiita-image-store.s3.amazonaws.com/0/12362/0fdf9639-e168-0a4c-366b-2ed61eb9efac.png)

##Swift Compliler - Custom Flagの設定

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

`-DDEBUG`など
![スクリーンショット 2014-10-12 23.02.28.png](https://qiita-image-store.s3.amazonaws.com/0/12362/209103ca-f9af-f1cd-904a-111d774be758.png)

##Build Setting の追加

（１）複製します
![スクリーンショット 2014-10-12 23.08.04.png](https://qiita-image-store.s3.amazonaws.com/0/12362/8e0c0334-f335-e250-3be3-d3e00f51a816.png)


（２）`Duplicate Only`を選択

![スクリーンショット 2014-10-12 23.08.14.png](https://qiita-image-store.s3.amazonaws.com/0/12362/a78c76fe-34b8-c88c-e164-1e937c7c0409.png)


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

![スクリーンショット 2014-10-12 23.48.21.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d4a22ef8-d593-f243-5829-f8d3281b170b.png)

**Product Name**の変更
![スクリーンショット 2014-10-12 23.48.57.png](https://qiita-image-store.s3.amazonaws.com/0/12362/a4454e2e-815d-d929-cdf8-652944e3c2b7.png)

**plist**の変更
![スクリーンショット 2014-10-12 23.49.33.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d9156119-e041-6063-2510-242e26ac2168.png)

**Targets**の表示部分の変更
![スクリーンショット 2014-10-12 23.51.24.png](https://qiita-image-store.s3.amazonaws.com/0/12362/aed452ff-271e-9603-dedc-13b7b5f3eb22.png)

##Schemeの設定

（１）`Manage Schemes...`を選択

![スクリーンショット 2014-10-12 23.16.50.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d6252652-496c-eb43-e399-bffd80a1022f.png)

（２）Scheme名を変更

![スクリーンショット 2014-10-13 0.11.21.png](https://qiita-image-store.s3.amazonaws.com/0/12362/ef815e03-ac02-37f0-c81d-c193aca39764.png)

（３）Configurationを設定

![スクリーンショット 2014-10-12 23.39.20.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e4191d49-405a-1fd1-d689-36c72843446e.png)

#実行してみる

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

![スクリーンショット 2014-10-13 1.03.33.png](https://qiita-image-store.s3.amazonaws.com/0/12362/b319e8cd-f100-6ba9-af68-a8a5da3faa5f.png)

##DEBUG
![スクリーンショット 2014-10-13 1.14.56.png](https://qiita-image-store.s3.amazonaws.com/0/12362/61ad1821-b7dd-d1d5-ffaa-85457980704b.png)

##DEBUGの複製Setting
![スクリーンショット 2014-10-13 1.13.45.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d72c2efa-8658-94d3-330f-924f2a522c08.png)

##RELEASEの複製Setting

![スクリーンショット 2014-10-13 1.14.22.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e96dcd9c-20f0-be0e-4354-644b59aede55.png)

##結果を見て書き換え

```swift: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ありきの手探りでたどり着くことがまだ多いです。
出来ることと、正しい手法かは実際にやってみた方や、知見のある詳しい方からの情報がもっと必要です。