何言ってんだおめー。SwiftとObjective-CなんかBridging Headerかimport "-Swift.h"で余裕だろwww
って思ってた時期私にもありました。
#とりあえずおさらい
通常アプリを開発する場合、Objective-CのファイルにSwiftのファイルをインポートする時、"プロジェクト名-Swift.h"をインポートします。
SwiftのファイルにObjective-Cのファイルをインポートする場合は、Bridging Headerを作成し、使用したいObjective-Cのヘッダーをインポートすることで使用することができます。
#フレームワークで使ったら死ぬ
「Swift Objective-C import」とかでググったら上記の情報がいっぱい出てくるし、そのままでいけると思うじゃないですか?
ですが、Frameworkで使用した場合、コンパイルエラーが発生しビルドが通らなくなります。
#じゃあどないすればええんや・・・?
こういう時のための公式リファレンスを読んでみると答えが書いてありました。
#フレームワーク上でSwiftにObjective-Cをインポートする
-
TargetのBuild Setting からDefine Moduleの設定をYesにします。
-
Umbrella headerファイルにSwift側で使用したいObjective-Cファイルのヘッダーをimportします。
#import <FrameworkName/yourFirstFile.h>
#import <FrameworkName/yourSecondFile.h>
#import <FrameworkName/yourThirdFile.h>
Umbrella headerはCocoaTouchFrameworkのプロジェクトを作成した際に初期状態で生成されている「フレームワーク名.h」ファイルのことです。
以上の手順を行うと、SwiftのファイルでObjective-Cのファイルにアクセスできます。
#フレームワーク上でObjective-CにSwiftをインポートする
-
TargetのBuild Setting からDefine Moduleの設定をYesにします。
-
Objective-Cからアクセスしたいクラスや変数などに@objcをつけます
-
Objective-C側で使用したいSwiftのアクセス修飾子をpublicまたはopenにします。
-
SwiftのファイルにアクセスしたいObjective-Cの.mファイルに「-Swift.h」をimportします。
#import <ProductName/ProductModuleName-Swift.h>
以上の手順で、Objective-CからSwiftへのアクセスが可能になります。
#正直イケてない件
ここまで読んで違和感を感じないでしょうか?
Objective-CをUmbrellaHeaderでimportしたり、SwiftをPublicとかOpenにすれば、外部からアクセスされるくね・・・?
そこなんですよ。イケてないのは。
言語を越えてアクセスするために無駄にファイルを公開しなきゃいけないので、内部のみで使用しているファイルがSwiftとObjective-C混在だった場合とかにすごい困ります。スーパー公開祭りが発生します。
これに関しては、誰かいい方法知らないですか?って聞きたいですね。
#まとめ
-
Build SettingでDefine ModuleをYesに設定しようね
-
この表に従ってimportしようね
Swiftに | Objective-Cに | |
---|---|---|
Swiftをインポート | インポート不要 | #import <ProductName/ProductModuleName-Swift.h> |
Objective-Cをインポート | Umbrella Headerにインポート | #import "Header.h" |
-
SwiftはpublicかopenじゃないとObjective-Cにimportされないから気をつけてね
-
ここまで書いておいてなんだけど、 どっちか片方で作った方がいい