移行(Part IV)
Objective-C コードから Swift への移行
Migration (移行)は、既存の Objective-C アプリを再検討し、Swift でその部分を置き換えることにより、そのアーキテクチャ、ロジック、およびパフォーマンスを改善する機会を提供します。アプリの簡単な、段階的な移行では、以前に学んだツールを使って、うまく組み合わせて相互運用性を使うことになるでしょう。うまく組み合わせる機能は、どの特徴と機能を Swift で実装するか、そして Objective-C にどれを残しておくかを選択することが簡単にできます。相互運用性により、煩わしくなく Objective-C コードにこれらの機能を戻して統合することができます。一度で Swift のアプリ全体を書き換えることなく Swift の豊富な機能を探検するのにこれらのツールを使用し、既存の Objective-C アプリに統合してください。
移行のための Objective-C コードの準備
コードベースの移行を開始する前に、Objective-C と Swift のコードが、最適な互換性を持っていることを確認してください。これは既存の Objective-C のコードベースの片付けと最新化を意味します。既存のコードは、簡単にシームレスに Swift と対話できるようにでき、最新のコーディング慣行に従えるでしょう。前に進む前に、実践の短いリストの、最新の Objective-C の採用 をご覧ください。
移行プロセス
Swift にコードを移行するための最も効果的な方法は、一度に一つのファイル単位で、つまり一度に一つのクラスを移すことです。Objective-C で Swift のクラスをサブクラス化することはできないので、サブクラスを持っていないアプリでクラスを選択するのが最良の選択です。一つの .swift ファイルを使用して、そのクラスの .m と .h ファイルを置き換えます。実装とインタフェースからすべてがこの一つの Swift ファイルに直接移動します。ヘッダファイルを作成する必要はありません。Xcode はそれを参照する必要がある場合に自動的にヘッダを生成します。
はじめる前に
✔[File(ファイル)]>[New(新規作成)]>[File(ファイル)]>[(iOS,watchOS,tvOS, または macOS)>[Source(ソース)]>Swift ファイルを選択して、対応する Objective-C の .m と .h ファイル用の Swift クラスを作成します。Objective-C クラスと同じか、または異なる名前を使用できます。クラスの接頭辞は Swift ではオプションです。
✔関連するシステムフレームワークを import します。
✔Swift のファイルで同じアプリ・ターゲットから Objective-C コードにアクセスする必要がある場合は、Objective-C のブリッジヘッダの必要事項を記入してください。手順については、同じアプリターゲット内からコードを import を参照してください。
✔Objective-C に戻って、Swift クラスがアクセス可能で、利用可能にするには、Objective-C クラスの子孫にします。Objective-C で使用するクラスの特定の名前を指定するには、Objective-C コードが Swift クラスを参照するために使用する名前である name を @objc(name) でマークします。@objc の詳細については、Swift の型の互換性 を参照してください。
作業中に
✔Objective-C のプロトコルを採用し、さらに、Objective-C クラスをサブクラス化することで Objective-C の動作を統合するために、Swift クラスを設定できます。詳細については、Swift のクラスとプロトコルの書き方及び Objective-C の動作 を参照してください。
✔Objective-C の API で作業している場合、Swift が特定の Objective-C の言語機能を翻訳する方法を知る必要があります。詳細については、Objective-C の API との相互作用 を参照してください。
✔Cocoa フレームワークを組み込んだ Swift のコードを書くときには、特定の型はブリッジされるため、Objective-C の型の代わりに、Swift 型を操作できることを覚えておいてください。詳細については、Cocoa フレームワークでの作業 を参照してください。
✔Swift クラスに Cocoa パターンを組み込む場合は、一般的なデザインパターンを翻訳する方法については、Cocoa デザインパターンの採用 を参照してください。
✔Swift に Objective-C からプロパティを翻訳する上での考慮事項については、Swift プログラミング言語(Swift 4.0.3) の プロパティ をお読みください。
✔必要なときに、@objc(name) 属性を使用して、プロパティとメソッドに Objective-C の名前を提供して下さい。たとえば、以下のように Objective-C で isEnabled という名前のゲッタを持つ enabled というプロパティをマークできます。
- @objc var enabled: Bool {
-         @objc(isEnabled) get {
-                // ...
-         }
- }
<< SWIFT >>
✔それぞれ、func と class func でインスタンスメソッド(-)と クラスメソッド(+)を表します。
✔グローバル定数として簡単なマクロを宣言し、複雑なマクロを関数に翻訳します。
見終わったら
✔Objective-C のコードでの import 文を更新(#import "ProductModuleName-Swift.h"に) します。詳しくは 同じアプリターゲット内からコードを import を参照して下さい。
✔ターゲット·メンバーシップ·チェックボックスの選択を解除して、ターゲットから元の Objective-C の .m ファイルを削除します。すぐに .m ファイルや .h ファイルを削除しないでください。トラブルシューティングするためにそれらを使用します。
✔Swift クラスに別の名前を与えた場合は、Objective-C の名前の代わりに Swift クラスの名前を使用するようにコードを更新します。
トラブルシューティングのヒントと注意
各々の移行の経験は、既存のコードベースに応じて異なっていても、あなたのコードの移行のトラブルシューティングに役立つ、いくつかの一般的な手順とツールがあります。
- Objective-C では Swift クラスをサブクラス化することはできないことを覚えておいてください。そのため、移行するクラスは、アプリ内では Objective-C のサブクラスを持つことは全くできません。
- Swift にクラスを一度移行したら、重複したシンボルエラーを回避するために、ビルドする前にターゲットから、対応する .m ファイルを削除しなければなりません。
- Objective-C 内でアクセスし使用可能にするには、Swift クラスは、Objective-C のクラスの子孫でなければなりません。
- Objective-C に Swift コードを持って来ると、その Objective-C は、Swift に固有の特定の機能を翻訳することはできない事を覚えていて下さい。リストについては、Objective-C からの Swift の使い方 を参照してください。
- 生成されたヘッダを見るには Swift クラス名をコマンドクリックして下さい。
- その型、属性、およびドキュメントのコメントのように、それについての暗黙の情報を表示するには、シンボルを Option-クリックして下さい。
前:同じプロジェクトでの Swiftと Objective-C 後:マニュアルの更新履歴