公式ドキュメント: Swift and Objective-C in the Same Project のサンプル的な実装
具体的には下記をしている
- Embedded Framework の
- Objective-C から Embedded Framework の Swift をコールする
- Swift から Embedded Framework の Objective-C をコールする
- Action Extension 内の Swift から
- Embedded Framework の Swift をコールする
- Embedded Framework の Objective-C をコールする
- EmbeddedFramework Target を作る
- File > New > Target
- Framework & Library > Cocoa Touch Framework
- Target の名前は EmbeddedFramework にしました。言語は Swift にしました。
- Framework を実装する
- ObjcClass.h
- ObjcClass.m
- ポイントは
#import <EmbeddedFramework/EmbeddedFramework-Swift.h>
- 詳細は公式ドキュメントの To import Swift code into Objective-C from the same framework の項参照
- ポイントは
- SwiftClass.swift
- ポイントは2点
@objc
- クラス、イニシャライザ、公開API のスコープを明示的に public 宣言
- ポイントは2点
- Xcode が自動生成した EmbeddedFramework.h (umbrella header というそうな) に import 宣言を追加
#import <EmbeddedFramework/ObjcClass.h>
- SwiftClass.swift を Public にする
- Build Settings の Defines Modules の値を YES に変更する
- 公式ドキュメント の Importing External Frameworks の項参照
- ActionExtension Target を作る
- File > New > Target
- Aplication Extension > Action Extension
- Target の名前は ActionExtension にしました。言語は Swift にしました。
- Linked Frameworks and Library に 上で作成した EmbeddedFramework を追加する NOTE: 赤字になっているけど実機ビルドしたタイミングで黒字になるので気にしなくて OK
- Xcode が自動生成した ActionViewController.swift に import 宣言を追加
import EmbeddedFramework
- Embedded Framework の API をコールする
- 下記のログが Console に出力されれば OK
var swift = SwiftClass()
swift.run()
var objc = ObjcClass()
objc.run()
- Scheme を ActionExtension > iPhone 6 として実行
- Choose an app to run で Safari を選択
- 適当な Web ページを表示して
- Action ボタンをタップ
- ActionExtension ボタンをタップ
2014-12-03 12:03:30.359 ActionExtension[25136:2492371] call Objc from Swift in Embedded Framework
2014-12-03 12:03:30.359 ActionExtension[25136:2492371] call Swift from Objc in Embedded Framework
Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, "8.1"
link_with 'EmbeddedFramework'
pod "AFNetworking"
こんな感じ Podfile で pod install
して umbrella header に
#import <AFNetworking/AFNetworking.h>
を記述したところ下記のエラーがでます。
Swift Compiler Error
Include of non-modular header inside framework module 'StackKit'
- Xcode 6.1
- cocoapods 0.35.0.rc2
どうやら EmbeddedFramework で Cocoapods と Swift を併用するには cocoapods 0.36 を待つ必要があるみたい。
上記リンク先の Gemfile で開発中のものを Install してみましたが、状況改善しませんでした。
Workaround ですらないんだけど、EmbeddedFramework から Swift の実装を消したところこのエラーは解消されました。 つまり Embedded Framework は Objective-C のみで記述するのがとりあえずの解決策(解決してない)。
Embedded Framework を Objective-C でのみ記述した実装例は Qiita でも公開されていました。