Swift 4.2 日本語化計画 : Swift 4.2
Swift 4 への移行
XCode 10.1 には、プロジェクトを Swift 4 に移行するのに役立つ Swift 移行ツールが付属しています。
移行前の準備
移行しようとするプロジェクトが Swift 3.2 モードでうまくビルドされ、すべてのテストに合格していることを確認して下さい。Swift 3.2 は 3.1 から大幅な変更が加えられており、ビルドした SDK も大幅に変更されているため、最初にエラーを解決する必要があるかもしれません。
プロジェクトをソース制御下で管理することを強くお勧めします。これにより、移行アシスタントによって適用された変更を簡単に確認し、それらを破棄して必要に応じて移行を再試行することができます。
去年とは異なり、移行ツールは別のツールではなくコンパイラに直接組み込まれているので、Swift 4 コンパイラと同様に、Swift 3.2 と Swift 4 のコードを同じように理解して一緒にコンパイルできます。つまり、プロジェクトに合ったときにターゲットごとに移行するかどうかはいつでも決められます。Swift 4 への移行は間違いなく勧めらますが、それはありかなしかのプロセスではなく、Swift 3.2 と Swift 4 のターゲットは共存でき、互いにリンクすることができます。
移行アシスタントは、選択したスキームを使用して変更を収集するために、移行ツールのビルド を実行します。処理されるターゲットは、スキームに含まれているものです。スキームに含まれている内容を確認して変更するには、 スキームの編集... シートを呼び出し、左側の列から ビルド タブを選択して、すべてのターゲットと単体テストが含まれていることを確認します。
Swift 移行アシスタント
初めて Xcode 9 を使用してプロジェクトを開くと、Issue Navigator (問題ナビゲータ) に移行案件が表示されます。クリックすると、移行するかどうか尋ねるシートが表示されます。後で思い出すことができ、または、メニューから [編集] -> [変換] -> [現在の Swift 構文へ] を選択すると、移行ツールを手動で呼び出すことができます。
移行するターゲットのリストが表示されます。Swift コードを含まないターゲットは選択されません。
今年は 1 つの移行ワークフローしかありませんが、2 種類の @objc 推論 の中から選択できます:
- 推論を最小化する:静的推論に基づいて必要な場合にのみ @objc 属性をコードに追加します。このオプションを使用した後は、変換を完了するために「Swift 4 の最小化推論移行を完了する」 に記載されている手動の手順に従う必要があります。
- Swift 3 の動作に一致:@objc 属性を、コンパイラによって暗黙的に推論された全ての場所のコードに追加します。このオプションは、Swift 3 によって暗黙的に追加されたすべての明示的な @objc 属性を追加するので、バイナリのサイズを変更しません。
[次へ] をクリックすると [プレビュー生成] シートが表示され、アシスタントはソースの変更を取得するために 移行ビルド を開始します。これが完了した後、"保存" をクリックすると適用されるすべての変更が表示されます。これにより、移行されたターゲットの Swift 言語バージョン ビルド設定も Swift 4 に変更されます。
移行プロセスに悪影響を与えるターゲットの処理に問題がある可能性があります。レポートナビゲータ に切り替えて、追加されたエントリの 変換 を選択します。これは変換ビルドログです。ログで表示された可能性のあるエラーを確認して下さい。
ターゲットにコード署名できないというエラーが表示された場合は、ターゲットのビルド設定からコード署名を無効にしてみてください。他のエラーが表示された場合は、バグレポートを提出して 詳細を記入してください。可能であれば、問題のある移行を示すプロジェクトを添付することを強くお勧めします。
Swift 4 移行の変更の概要
移行ツールが提案する変更の大部分は、以前の SDK と現在の SDK の比較によって生成されたデータから、もたらされ、これにより、識別子や型の名前が変更される可能性があり、例えば、通常の コンパイラから修正 されています。移行ツールが直接的機械的な変更を安全に実行できる特別な条項がいくつかあります。
SDK の変更点
最も一般的な SDK の 2 つの変更点は、グローバル定数を静的型プロパティに移し、文字列定数を Swift の列挙型に変換することです。これらは 移行ツールによって自動的に処理されます。さまざまな型シグネチャの変更も表示されます。
注目すべき特別なケース
新しい String
String には Swift 4 の新しい API があり、その一部は今や Substring または String を返します。この移行を容易にするために、移行ツールは、API が現在異なる型を予期している場合に、明示的なイニシャライザ変換を挿入します。
SE-0110:単一タプル関数型と複数引数型関数型の区別
f: (Void) -> ()
関数の引数の型に f: (Void) -> () を使用する場合、一般的に f: () -> () を意味しますので、移行ツールは代わりにこの型を使用することを推奨します。さもなければ、Swift 4 の SE-0110 の新しいルールでは、関数 f を f(()) と呼ぶ必要があります。
タプルの構造体解除の追加
以下のようなコードの場合:
swift func foo(_: ((Int, Int) -> ()) {} foo { (x, y) in print(x + y) }
移行ツールは、Swift 4 でのビルドを継続するために、明示的なタプルの構造体解除を以下のように追加する必要があります。
swift func foo(_: ((Int, Int) -> ()) {} foo { let (x, y) = $0; print(x + y) }
デフォルトのパラメータ値は public です
コンパイラは、あなたの public 関数のデフォルト引数として参照される、リテラルでない値のアクセス可能性についてより厳格になりました。それらはまた public でなければばなりません。とりわけ、これは呼び出しサイトでの値へのアクセスを最適化する機会を提供します。これには API の設計が必要な場合があるため、移行ツールは修正案を提案しませんが、API 作成者として考慮する余地はあります。
- 参照されるデフォルト値を public にします。
- 分かりやすいデフォルト値を返す public 関数を提供します。
移行の後
移行ツールは多くの機械的な変更を処理しますが、移行ツールの変更を適用した後でプロジェクトをビルドできるようにするには、手動でさらに変更する必要があります。
関連する修正が必要なコンパイラエラーが表示されることがあります。移行ツールは Swift 4 コンパイラが提供する修正を組み込むように設計されていますが、時間の 100% 適用されない場合は修正が適用されないことがあります。
たとえコンパイルがうまく行っても、移行ツールが提供したコードは理想的ではないかもしれません。あなたの最善の判断を使用して、変更があなたのプロジェクトに適していることを確認してください。
移行に関する既知の問題
Carthage/CocoaPods プロジェクトの使用
Carthage、CocoaPods、または Swift Package Manager などのパッケージマネージャを使用して、外部依存関係を持つプロジェクトを移行する際に考慮すべき重要な点をいくつか示します。
- 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)] -> [現在のスイフト構文(Current Swift Syntax)] を実行して、残りのスキームを移行して下さい。または、プロジェクトからのすべてのターゲットを含むスキームを作成し、移行アシスタントを実行する前に選択しておくこともできます。