search
LoginSignup
45
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

SwiftとObjective-C連携 with Xcode

環境

Xcode 9.3

Screen Shot 2018-10-31 at 23.15.26.png

書いたこと

  • 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 にする。

Screen Shot 2018-10-31 at 22.38.00.png

2. Bridging-Headerの追加

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

Screen Shot 2018-10-31 at 22.41.22.png

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

Screen Shot 2018-10-31 at 22.46.17.png

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ライブラリーのモジュール化

参照

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
45
Help us understand the problem. What are the problem?