SwiftとObjective-C連携 with Xcode


環境

Xcode 9.3

書いたこと

  • SwiftからObjective-Cコードを呼び出す方法
  • Objective-CからSwiftコードを呼び出す方法

SwiftからObjective-Cコードを呼び出す方法

流れ

  1. Build Settings を設定
  2. Bridging-Header.h の追加
  3. Swiftから呼び出すファイルを2で追加したブリッジングヘッダーにimportする

1. Build Settings を設定

PackagingDefine Modules 項目を true にする。

2. Bridging-Headerの追加

新規ファイルの追加から Objective-C ソースファイルを追加するとダイアログが表示されるので、 Create Bridging Header ボタンを押下。

Build Settings で Bridging-Headerに、 <ProjectName>-Bridging-Header.h ファイルが指定されていることを確認する。

3. Bridging-Headerにインポート

SwiftCallObjc-Bridging-Header.h
// Swiftから呼び出すObjファイルをimportする
#import "Foo.h"

Objective-CからSwiftを呼び出す方法

流れ

  1. Build Settings を設定
  2. Swift APIを呼び出す .m ファイルで <Product_Module_Name>-Swift.h ファイルを import する

1. Build Settings を設定

PackagingDefine Modules 項目を true にする。

2. <Product_Module_Name>-Swift.h ファイルを import する

Product Module Name は、 ※Build Settings* で確認できる。

Foo.m
// モジュール名がObjcCallSwiftの場合 (以下のファイルは自動的に生成される)
#import "ObjcCallSwift-Swift.h"

NOTE: 英数字以外の文字が使われている場合は、 その部分をアンダースコアに置き換える。

Foo.m
//モジュール名が Swift-Objcの場合
#import "Swift_Objc-Swift.h"

まとめ

タイトルで With Xcode とした理由は、 \<ProjectModuleName\>-Bridging-Header.h\<ProjectName\>-Swift.h は、あくまでもXcodeを介した機能であるため。
Xcodeを介さない場合は、それぞれモジュール化してimportする方法がある。
以下を参照してください。
[swift] Cライブラリーのモジュール化

参照