しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

SwiftでObjective-cのマクロのような事を実現する

Swiftで擬似マクロ

Swiftファイルではマクロを定義する事ができません。
同様の事をしたい場合は下のようにclassの外に変数を定義します。
もちろん他のSwiftファイルからも参照できます。
グローバル変数となるのであまり使いたくないですが。

let MACRO = "aaa"

class MyClass {
    func method() {
        print(MACRO) // → aaa
    }
}

引数付きのマクロと同様の事をしたい場合は下のようにメソッドを定義します。

func MACRO(value: String) -> String {
   return value + "+++"
}
 
class MyClass {
    func method() {
        print(MACRO("Hello")) // → Hello+++
    }
}

Objective-cのマクロを呼ぶ

Objective-cのマクロはBridging-Headerに定義されているかBridging-Headerでインポートしているファイルにあるものなら呼ぶ事ができます。

#define MACRO "String"
// SwiftからObjective-cで定義したマクロを呼ぶ
print(MACRO)

しかし下のような値を渡すマクロは使う事ができません。

#define MACRO(value) "String"
// SwiftからObjective-cで定義したマクロを呼ぶ
print(MACRO("AAA")) // → これはエラー

まとめ

以上のような事で簡単なマクロはSwiftでも再現する事ができます。
しかしマクロのようにコードを置換するものではないため、複雑なマクロは定義できなさそうです。