[Swift] Objective-Cのマクロを使うときの注意点

問題

UIColorが定義されたdefineをbridging-headerでimportしたのに、
いざSwiftでその定数を使おうとすると、ビルドエラーになる。

Use of unresolved identifier

Swiftで #define (マクロ)を使う - Qiita
Objective-Cでは使えていた #define がSwiftになって使えなくなったように見えるのですが、Swiftベースのプロジェクトでも使うことは可能なようです。 Xcodeでプロジェクトを作成する際にLanguage:S...

やっていることはこれと一緒↑

原因

Swiftからは、簡単なマクロ(範囲があいまい…)しか呼べない

  • 数字系 ◯
  • UIColor ×

文字列も普通に定義"String"しただけなら使えるらしい?から、
C言語で使える定数はSwiftからも使えるけど、
NSObjectの定数は使えない、のかな…?(推測)

解決策

仕方がないので、マクロの値を返すだけのラッパークラスを作成して、
Swiftから使う時はそれを呼び出すようにした。

例

(全部メモ帳上で書いたので、間違いがあったら教えてください)

myProject-bridging-header.h

#import "wrapper.h"

define.h

#define MYCOLOR [UIColor colorWithRed:0.0 green:0.5 blue:1.0 alpha:1.0];

wrapper.h

#import <Foundation/Foundation.h>
#import "define.h"

@interface Wrapper : NSObject
+ (UIColor*) myColor();
@end

wrapper.m

#import "wrapper.h"

@interface Wrapper
+ (UIColor*) myColor() { return MYCOLOR; }
@end

呼び出す時は以下のようにして呼び出せばOK

main.swift

Wapper.myColor()

参考

https://medium.com/@YogevSitton/from-objective-c-to-swift-use-complex-define-macros-in-swift-28cdff464fc7