Swift 5.0 日本語化計画 : Swift 5.0
Swift 4.2 への移行
Xcode 10.0 には、プロジェクトを Swift 4.2 に移行するのに役立つ Swift 移行ツールが付属しています。
移行前の準備
移行しようとするプロジェクトが Swift 3 または Swift 4 モードで正常にビルドされ、すべてのテストに合格していることを確認します。最初はコンパイラの変更によるエラーを解決する必要があります。
プロジェクトをソース制御下で管理することを強くお勧めします。これにより、移行アシスタントによって適用された変更を簡単に確認し、破棄して必要に応じて移行を再試行することができます。
プロジェクトへの意味があるときにターゲットごとに移行するかどうか、また時期を決定します。Swift 4.2 への移行は間違いなく推奨されていますが、Swift 3、4、および 4.2 のターゲットは共存して共にリンクできるため、すべてのプロセスを移行するか否かではありません。
移行アシスタントは、選択したスキームを使用して変更を収集するために、移行ビルド を実行します。処理されるターゲットは、スキームに含まれているものです。スキームに含まれている内容を確認して変更するには、「(Edit Scheme) スキームの編集...」 シートを呼び出し、左側の列から 「(Build) ビルド」 タブを選択して、すべてのターゲットと単体テストが含まれていることを確認します。
Swift 移行アシスタント
初めて Xcode 10 でプロジェクトを開くと、Issue Navigator に移行機会が表示されます。クリックすると、移行するかどうかを尋ねるシートが表示されます。後で思い出したり、または、メニューから[(Edit) 編集] -> [(Convert) 変換] -> [(To Current Swift Syntax) 現在の Swift 構文へ] を選択すると、(Migrator) 移行ツールを手動で呼び出すことができます。
移行するターゲットのリストが表示されます。Swift コードを含まないターゲットは選択されません。
選択したすべてのターゲットが Swift 4 モードになっている場合は、1 つの移行ワークフローしかありませんが、Swift 3 のターゲットでは、2 種類の @objc inference (推論) が選択できます。
- 推論を最小化:静的推論に基づいて必要な場合にのみ @objc 属性をコードに追加します。このオプションを使用した後は、変換を完了するために Swift 4 の推論移行の最小化を完了する に記載されている手動の手順に従う必要があります。
- Swift 3 の動作に一致:@objc 属性を、コンパイラによって暗黙的に推論されるコードの全ての場所に追加します。このオプションは、Swift 3 によって暗黙的に追加されたすべての明示的な @objc 属性を追加するので、バイナリのサイズを変更しません。
[(Next) 次へ] をクリックすると [(Generate Preview) プレビュー生成] シートが表示され、アシスタントはソースの変更を取得するために 移行ビルド を開始します。これが完了して「(Save) 保存」 をクリックすると適用されるすべての変更が表示されます。これにより、Swift 言語バージョン ビルド設定も Swift 4.2 に変更されます。
移行プロセスに悪影響を与えるターゲットの処理に問題がある場合があります。(Report Navigator) レポートナビゲータ に切り替えて、追加されたエントリの (Convert) 変換 を選択します。これは変換ビルドログです。ログに表示されるエラーを確認します。
ターゲットにコード署名できないというエラーが表示された場合は、ターゲットのビルド設定からコード署名を無効にしてみてください。他のエラーが表示された場合は、バグレポートを提出 して詳細を記入してください。可能であれば、問題のある移行を示すプロジェクトを添付することを強くお勧めします。
Swift 4.2 移行の変更の概要
(Migrator) 移行ツールが提案する変更の大部分は、以前の SDK と現在の SDK の比較によって生成されたデータからもたらされ、これにより、例えば ID や型の名前が変更される可能性があります。通常のコンパイラから修正されています (compiler fix-its)。
最も一般的な SDK の変更点は、グローバル定数を静的型プロパティに移動し、文字列定数を Swift 列挙型 case に変換したことです。これらは移行ツールによって自動的に処理されます。
Swift 3 コードから移行する場合は、去年の Swift 4 への移行 からの移行ツールの移行変更の概要もご覧ください。
移行後
移行ツールは多くの機械的な変更の面倒を見ますが、移行ツールの変更を適用した後にプロジェクトをビルドするには、手動でさらに変更する必要があります。
関連する修正があるコンパイラエラーが表示されることがあります。移行ツールは Swift 4 コンパイラが提供する修正を組み込むように設計されていますが、100% 適用されない場合は修正が適用されないことがあります。
たとえうまくコンパイルできても、移行ツールが提供したコードは理想的ではないかもしれません。あなたの最善の判断で、変更があなたのプロジェクトに適していることを確認してください。
プロジェクトの移行中に発生する可能性がある問題のリストについては、移行の既知の問題 セクションを参照してください。
移行の既知の問題
SDK
- 以下のようなエラー
- 回避策:移行ツールに挿入された変換関数を削除する/必要に応じて .rawValue を追加する
- 以下のようなエラー
- 回避策:| LHS と RHS の生の値は、結果を UIAccessibilityTraits(rawValue:) に渡し、LHS に代入します
- UIApplicationMain は、CommandLine.unsafeArgv の型に厳密に一致するように、2 番目の引数の型を変更しました
- 回避策:2番目の引数を CommandLine.unsafeArgv に置き換えます。
- AppKit を使用している macOS アプリケーションでは、以下のようなエラーが表示されます
- 回避策:rawValue: 引数ラベルを削除します。
Cannot assign value of type 'Int' to type 'UIBackgroundTaskIdentifier' (型 'Int' の値を型 'UIBackgroundTaskIdentifier' に代入できない)
binary operator '|=' cannot be applied to two 'UIAccessibility.Traits' operands (バイナリ演算子 '| =' は 2 つの 'UIAccessibility.Traits' オペランドには適用できません)
argument labels '(rawValue:)' do not match any available overloads (引数ラベル '(rawValue:)' が使用可能なオーバーロードと一致しません)
その他
- Swift 移行ビルドは Other Swift Flags ビルド設定を無視します
- #else を含まない条件付きコンパイル分岐と、渡されている予想された -D フラグがないため、戻りエラーが見つからないことを主張します。
- 回避策:必要に応じて、移行前に適切なアサーション/ fatalError() を付けて #else 句を追加してみてください
- Swift 移行ツールを介して適用された変更は開いているドキュメントには表示されません
- 回避策:別のファイルに切り替えて元に戻すと、変更が表示されます。
- main.swift ファイルの場合、移行ツールはヘルパー関数をファイルの末尾に追加することがあり、これらの関数は前のトップレベル式では利用できません。
- 回避策:インポート後にヘルパー関数をファイルの先頭に移動します。
Carthage/CocoaPods プロジェクトの使用
Carthage、CocoaPods、Swift パッケージマネージャ などのパッケージマネージャを使用して、外部依存関係を持つプロジェクトを移行する際に考慮すべき重要な点をいくつか示します。
- Swift 3.2 または Swift 4 モードでビルドされたバージョンを入手できない限り、Swift 3.1 モジュールは Swift 3.2/4 モジュールと互換性がないため、バイナリの Swift モジュールではなくソース依存関係を使用することをお勧めします。
- Swift 3.2 モードと独自のターゲットでソース依存関係が正常にビルドされていることを確認してください。
- Carthage のビルドフォルダ内でバイナリの Swift モジュールを検索するためのフレームワーク検索パスを設定している場合は、Xcode ワークスペースからビルドされた Swift モジュールのみを使用していることを確認するために、検索パスを削除するか、ビルドフォルダ内を削除します。
- Swift 3.2 モードでビルドできる限り、ソースの依存関係を移行する必要はありません。
その他
- プロジェクト内に異なるターゲットをカバーする複数のスキームがある場合、それらのうちの 1 つを移行する必要があるという通知が表示されます。新しいスキームを手動で選択してから、「(Edit) 編集」 ->「(convert) 変換」 ->「(To Current Swift Syntax) 現在の Swift の文法へ」 を実行して、残りのスキームを移行する必要があります。または、プロジェクトのすべてのターゲットを含むスキームを作成し、移行ツールを実行する前に選択しておくこともできます。