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

Objective-C
スポンサーリンク
こんにちは。 雑食会社員🐼くま子です
スポンサーリンク

問題

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

Use of unresolved identifier

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

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

原因

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…

コメント