Objective-CからSwiftへ移行することのメリットは他の記事等に譲るとして、
ここではObjective-Cで書かれた既存アプリをどうSwiftに移行するのが良いのか、ということを書く。
(別にそんなに大げさな内容ではないけど)
経緯
新しいクラスを実装するときは普通にSwiftなクラスを作って書けば良いし、Objective-Cで書かれた既存クラスへの機能追加をする際もSwiftでサブクラス化、またはextensionに機能を実装すればいいけど、そんなこんなでSwiftで書いていると、既存コードもすべてSwiftにしたい衝動に駆られる。
リファクタリング対象が活発に機能追加や変更されるものであれば尚の事。
冗長な型宣言をしなくて良くなるし、大抵Swiftのほうがコードが見やすくなる等、明確なメリットがある。
小さなクラスであればリファクタリングは楽だが、クラスが巨大な場合
- エンバグのリスク
- 大きな工数がかかる
- 心理的なハードルの高さ
等の要因から手がつけづらい。
それでもSwiftにリファクタリングしたい
張り切って一気にリファクタリングしようとすると
- エンバグしたとき該当箇所の特定が難しい
- ディレクター的なポジションの人への工数かける交渉が難易度上がる
- 心理的なハードルがすごい高い
ので、機能追加や修正するときに調整する箇所の周辺から徐々にSwift化していく、というが現実的。
で、そのためにどうするかというと
- まず対象のObjective-Cクラスを置き換えるSwiftクラスを作り、必要に応じて利用している箇所の対象クラス名を変更(大抵接頭辞を除去するだけ)
- プロパティや移植しやすいメソッドをSwiftの方に移植
- (複雑だったりコードが多かったりして)移植作業を次以降のバージョンに回したいものは、Swiftクラスに対してObjective-Cのカテゴリで既存の実装を付け足す
- 次に作業するときにそのカテゴリからSwiftクラスに移植していく
という方法で、なだらかな移行ができる。
Remember that you cannot subclass a Swift class in Objective-C. Therefore, the class you migrate cannot have any Objective-C subclasses in your app.
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/Migration.html
の通り、Objective-CでSwiftで実装されたクラスのサブクラスを作ることはできないためカテゴリで実装を付け足している。
おわりに
対象の実装に今後修正が入らない場合、Swift化するメリットはないのでそっとしておくのが良いと思っている。
その場合のリファクタリングは自己満足の世界なので、個人開発者でないと厳しそう。