Objective-CにSwiftを組み込むときに必須!Bridging Headerについて
最近は会社でiOSを触っているのですが「いい加減新しいのはSwiftで書きはじめよう」ということで、Swiftをじわりじわり書いています。佐伯です。
やはりSwiftは分かりやすい。というよりとっかかりやすい。
Objective-Cの気持ち悪い[ ]記法よりも、javascriptよりで感覚的にメソッド、プロパティにアクセスできる。セミコロンが要らないのはまだ違和感があるけど
んで、よっしゃ!Swiftでばりばり書くでー!と意気込んでやってみたものの、即大きな壁にぶち当たった。Objective-Cのクラスを使えない。
インポートが必要なわけでもないっぽい。
調べるとどうやらObjective-CのプロジェクトでSwiftを使うにはBridging Header(ブリッジングヘッダー)というファイルを作らないといけないみたい。
なんぞそれ
どのObjective-CクラスをSwiftで利用するかを記載したもの。
一般的には"$(TTARGET_NAME)-Bridging-Header.h"という名前のファイルが使われる。
書き方は他のヘッダーファイルのように"#import"を使い、他のヘッダーファイルで定義されているObjective-Cクラスを取り込むようにする。Objective-CのクラスをSwiftへ橋渡ししてくれるものみたい。
ブリッジングヘッダーの初期設定
・プロジェクトに <# $TARGET_NAME #>-Bridging-Header.h という名前のファイルを追加
・Build Settingから上記ファイルを設定
XcodeのBuild Settingから"Swift Compiler - Code Generation"カテゴリがある。その中に"Objective-C Bridging Header"のところに"$TARGET_NAME"/$(TARGET_NAME)-Bridging-Header.h"のように記載することでブリッジングヘッダーが有効化させる。
例えば、以下のようなヘッダークラスがObjective-Cであったとする。
@interface EZOcject:NSObject
@property(readwrite,strong)NSString *name;
@property(readwrite,strong)NSString *note;
-(id)initWithName:(NSString*)name;
-(id)initWithName:(NSString*)name note:(NSString*)note;
@end
//上記コード:http://program.station.ez-net.jp/special/handbook/swift/class/objc.asp
このようなときにブリッジングヘッダーファイルにEzObject.hをインポートしておけば、このクラスをSwiftで利用することが出来る。
class EzObject:EzObject{
override func textWithString(string:String)->String{
return super.textWithString(string)
}
}
//上記コード:http://program.station.ez-net.jp/special/handbook/swift/class/objc.asp