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

Objective-C
スポンサーリンク
スポンサーリンク

問題 UIColorが定義されたdefineをbridging-headerでimportしたのに、 いざSwiftでその定数を使おうとすると、ビルドエラーになる。 Use of unresolved identifier Swiftで #define (マクロ)を使う - Qiita Objective-Cでは使えていた #define がSwiftになって使えなくなったように見えるのですが、Swiftベースのプロジェクトでも使うことは可能なようです。 Xcodeでプロジェクトを作成する際にLanguage:S...qiita.com やっていることはこれと一緒↑ 原因 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()

参考

From Objective-C to Swift: Use Complex #define Macros in Swift
Swift is a (not so) new programing language announced by Apple on June 2014 during WWDC of the same year. The announcement was exciting and…

コメント