概要
今回自分のアプリの機能拡張をSwiftで行った時に、生じたポイントについてまとめます。
SwiftとObjective-Cの共存の際のポイント
SwiftでObjective-Cのクラスを参照する
Objective-C bridge headerを使用する。
プロジェクトにSwiftのコードを追加すると、<プロジェクト名>-Bridge-Header.hが追加されるので、参照したクラスのヘッダーをimportする。
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
# import "Location.h"
Objective-CからSwiftのクラスを参照する。
<プロジェクト名>-Swift.hをインポートする
Xcode上のインスペクタには表示されてませんが、Swiftを参照するためのヘッダーが自動的に用意されるので、インポートすればOK。
下記のサンプルは私のプロジェクトの一部です。
# import "MapViewController.h"
# import "AtMiyakojima-Swift.h" //Swiftのクラス呼び出し用
enum
Cのenumではなく、Objecttive-CでNS_ENUMを使う。
Swiftで定義したenumはObjective-Cでは使えないっぽい。参考
正直、これについてはenumを使う意味をあまり見いだせなかった。
互いの publicな定数を引用すればよいかと思ったり。
知識として、記述。
文法の違い
isKindOfClass
Objective-Cのクラスチェックは
if([object isKindOfClass:[MyClass class]])
{
//ToDo...
}
と記述するが、Swiftでの推奨例は
if object is MyClass
{
//ToDo...
}
となる。
その他
Xcodeでリファクタリングができない
Xcode7.3.1でもObjective-Cしか対応してなかった。
残念
まとめ
まだピュアSwiftでアプリを作ったことがないので、色々とハマりどころはありそうですが、まだ完全にSwiftへの移行ができるわけでもないので(Unityプロジェクトなど)当面は共存の道を探っていくのがよさそうです。