Posted at

Objective-CからSwiftに移行した際のポイント

More than 3 years have passed since last update.


概要

今回自分のアプリの機能拡張を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プロジェクトなど)当面は共存の道を探っていくのがよさそうです。