Swift 3 への移行


これは、Xcode 8 および Swift 2 から移行するための従来の文書です。


Xcode 8.0 には、プロジェクトを Swift 3 に移行するための Swift Migrator ツールが付属しています。また、Swift 2.3 で動作するように更新するツールと新しい SDK が付属します。


移行前の準備


最も効果的な移行を行うには、Xcode 7.3[.1] を使用する場合、移行しようとするプロジェクトが正常にビルドされ、すべてのテストに合格していることを確認してください。


また、プロジェクトがソース制御下で管理されていることを確認してください。これにより、移行アシスタントを介して適用された変更を簡単に確認したり破棄し、必要に応じて移行を再試行することができます。


異なる独立した製品 (または異なるプラットフォーム用の同じ製品) をビルドする複数のスキームがある場合は、プロジェクト内のすべてをビルドするスキームを一つ作成し、ユニットテストターゲットを含む必要なすべてのプラットフォーム用に作成することが重要です。移行アシスタントは、選択したスキームを使用して変更を収集するために、移行ツールを "ビルド" します。そして、処理されるターゲットは、スキームに含まれるものです。


スキームに含まれている内容を確認して変更するには、"スキームの編集..." シートを呼び出し、左側の列から "ビルド" タブを選択し、すべてのターゲットとユニットテストが含まれていることを確認します。


プロジェクトが Carthage または CocoaPods によって提供される他のオープンソースプロジェクトに依存する場合は、Carthage/CocoaPods プロジェクトの使用 のセクションを参照してください。


Swift 移行アシスタント


初めて Xcode 8.0 を使用してプロジェクトを開くと、移行アシスタントを経由して移行パスを実行するよう求められます。アシスタントはメニューから Edit -> Convert -> To Current Swift Syntax… で手動で呼び出すこともできます。


2 種類の移行から実行を選択できます。



必要に応じて、今は Swift 2.3 に移動し、後で Swift 3 に更新するために、再度移行アシスタントを呼び出すことができます。


移行アシスタントを起動し、"Swift 2.3 の使用" または "Swift 3 の使用W" を選択すると、移行するターゲットのリストが表示されます。Swift コードを含まないターゲットは選択できません。


[次へ(Next)] をクリックすると、[プレビューを生成(Generate Preview)]シートが表示され、アシスタントはソースの変更を取得するために移行の 'ビルド' を開始します。これが完了して、[保存(Save)] をクリックすると適用されるすべての変更が表示されます。diff ビューでは、元のソース (変換前) が右側にあり、変更した物は左側にあることに注意してください。[保存(Save)] をクリックすると、ソースの変更が元のファイルに対して適用されます。Swift 2.3 への移行を選択した場合、ターゲットには "Use Legacy Swift" ビルド設定が適用されます。


ターゲットの処理に問題がある場合、移行プロセスに悪影響を及ぼします。[レポートナビゲータ(Report Navigator)] に切り替え、追加された[変換(Convert)] エントリを選択します。これは変換ビルドログです。ログに表示される可能性のあるエラーを確認して下さい。


ターゲットにコード署名できないというエラーが表示された場合は、ターゲットのビルド設定からコード署名を無効にしてみてください。

他のエラーが表示された場合は、バグレポートを https://bugreport.apple.com に提出し、詳細を記載してください。


回避策を適用する必要がある場合は、以前に移行アシスタントから受け入れた変更を破棄し、回避策を適用し、手動でアシスタントを呼び出して最初から変換を再試行して下さい。


Swift 3 移行変更の概要


Swift 3 には多くの重要な変更があり、移行ツールがそれであなたをお助けできます。Swift 3 の発展の提案の概要をここで見ることができます:https://github.com/apple/swift-evolution


よりインパクトのあるソース変更の概要を以下に示します。


API 設計ガイドライン


Objective-C API は、新しいSwift API 設計ガイドライン に従って Swift 3 にインポートされます。これは、SDK のインポート方法と Objective-C ユーザーフレームワークの両方に影響します。Swift 標準ライブラリには、ガイドラインを順守するための多くの変更点があります。詳細については、提案 SE-0005 - Objective-C API の Swift へのより良い翻訳 を参照してください。移行ツールは、新しいガイドラインに一致させるために、ユーザーが宣言した enum (列挙型) を小文字にしています。


SDK


CoreGraphics や Dispatch などの特定のフレームワークや Foundation からの他の型は、グローバル関数と変数のセットとしてではなく、それぞれの Swift 型のメンバー関数とプロパティとしてインポートされます。詳細については、SE-0044 - メンバーとしてのインポート と、SE-0088 - Swift 3 命名規則のための libdispatch の最新化 を参照してください。


Swift 3 では、基盤となる Foundation 型から "NS" 接頭辞が削除されつつあります。SE-0086 - Swift Foundation での NS 接頭辞の削除 を参照してください。


Swift 標準ライブラリ


コレクションのインデックス作成モデルは Swift 3 で劇的に変化しました。詳細は SE-0065 コレクションとインデックスの新しいモデル を参照してください。最も目に見える変化は、インデックスにはもはや successor()predecessor()advancedBy(_:)advancedBy(_:limit:)、または distanceTo(_:) メソッドが存在しないことです。その代わりに、それらの操作はコレクションに移され、コレクションは現在インデックスの増分と減分を担当しています。


myIndex.successor()  =>  myCollection.index(after: myIndex)
myIndex.predecessor()  =>  myCollection.index(before: myIndex)
myIndex.advance(by: …) => myCollection.index(myIndex, offsetBy: …)


もし移行ツールがインデックスを担当するコレクションを知らない場合は、コレクションに記入する必要のあるエディタのプレースホルダを挿入します。


コレクションの変更をサポートするために、Range 型にもいくつかの変更が加えられました。以前は x..<yx...y は同じ型の Range<T> を生成していました。今や、これらの式は、RangeCountableRangeClosedRangeCountableClosedRange の 4 つの型のいずれか一つを生成できます。私たちは RangeRangeClosedRange の型に分割して、型の最大値を含む閉じた範囲を作成します (たとえば、0...Int8.max が今は動作します)。単純な範囲型とそれらの ~Countable (カウント可能な) 相手は機能が異なります:


..<... 演算子は正しいことを行い、最も可能な範囲を返そうとします。つまり、for i in 1..<10 のようなコードは CountableRange を推測して動作し続けます。1 つの範囲型として型指定された変数があり、別の型を受け入れる API にそれを渡す必要がある場合は、変換する範囲型のイニシャライザを使用します。


var r = 0..<10 // CountableRange<Int>
Range(r) // converts to Range<Int>


言語


訳注: UnsafeRawPointer 移行ガイド は、Swift.org の中にありますが、消耗なので訳出しません。

移行後


移行ツールは多くの機械的な変更を処理しますが、移行ツールの変更を適用した後にプロジェクトをビルドできるには、手動でさらに変更する必要があります。


関連する修正があるコンパイラエラーが表示されることがあります。移行ツールは Swift 3 コンパイラが提供する修正を組み込むように設計されていますが、これは 100% 動作することが保証されていません (特にターゲット間に依存関係がある場合)。


それがうまくコンパイルされたとしても、移行ツールが提供するコードは '理想的' ではないかもしれません。たとえば、'NS' の接頭辞付きの型 (NSRL での url) へのキャストを見ることができ、代わりに新しい URL 値の型で関連した API を使用するようにコードを再構築した方が良いでしょう。移行ツールが追加した新しいコメント (/* Migrator FIXME:... */) が表示される場合もあります。このコメントには、コードの変換方法に関するヒントが表示されます。


プロジェクトの移行中に発生する可能性がある問題のリストについては、既知の移行の問題 セクションを参照してください。


Carthage/CocoaPods プロジェクトの使用


Xcode ワークスペースでプロジェクトと共にビルドされていない他のプロジェクトのバイナリの Swift モジュールを使用している場合は、以下のいずれかの移行方法から選択できます。


既知の移行の問題


Swift 標準ライブラリ


SDK



Swift 3 言語



その他






目次
Xcode 9 の新機能

SwiftLogo
  • Swift について
  • 特徴
    安全
    Swift.org とオープンソース
    プロジェクト
    プラットフォームサポート
    アップルのプラットフォーム
    Linux
  • ブログ:Swift 4.0 リリース!
  • 言語の更新
    文字列
    コレクション
    アーカイブとシリアル化
    その他の言語の更新
    新しい互換モード
    Package Manager の更新
    文書化
  • プラットフォーム
  • Linux
    Apple(Xcode)
    ソース
  • Swift のローカルリファクタリング
  • リファクタリングの種類
    カーソルベースのリファクタリング
    レンジベースのリファクタリング
    診断
    テスト
    文脈上のリファクタリングテスト
    コード変換テスト
    Xcode との統合
    潜在的なローカルリファクタリングの考え方
  • Swift のダウンロード
  • リリース
    Swift 4.0
    Swift 3.1.1
    Swift 3.1
    Swift 3.0.2
    Swift 3.0.1
    Swift 3.0
    Swift 2.2.1
    Swift 2.2
    スナップショット
    基幹となる開発(マスター)
    古いスナップショット
    Swift 4.0 の開発
    古いスナップショット
    Swift 3.1 の開発
    古いスナップショット
    古いリリースの分岐
    ダウンロードを使用して
    インストール
    MacOS でのコード署名
    Linux
    必要
    サポートしているターゲットプラットフォーム
    インストール
    アクティブな署名鍵
  • Swift 4.0 入門
  • Swift のインストール
    Linux の場合
    REPL の使用
    パッケージマネージャの使用
    パッケージの作成
    実行可能ファイルの作成
    複数のソースファイルの操作
    LLDB デバッガの使用
  • 文書化
  • Swift プログラミング言語
    翻訳
    API 設計ガイドライン
  • API 設計ガイドライン
  • 目次
    基礎
    ネーミング
    明確な使用の促進
    流暢な使用を目指す
    用語をよく使う
    規約
    一般的規約
    パラメータ
    引数ラベル
    特別な命令
  • Swift 4 への移行
  • 移行前の準備
    Swift 移行アシスタント
    Swift 4 移行の変更の概要
    SDK の変更点
    注目すべき特別なケース
    新しい String
    デフォルトのパラメータ値は public です
    移行の後
    移行に関する既知の問題
    Carthage/CocoaPods プロジェクトの使用
    その他
  • Swift 3 への移行
  • 移行前の準備
    Swift 移行アシスタント
    Swift 3 移行変更の概要
    API 設計ガイドライン
    SDK
    Swift 標準ライブラリ
    言語
    移行後
    Carthage/CocoaPods プロジェクトの使用 既知の移行の問題
    Swift 標準ライブラリ
    SDK
    Swift 3 言語
    その他
  • ソースコード
  • コンパイラと標準ライブラリ
    Core Library
    パッケージマネージャ
    Xcode の Playground サポート
    クローンされたリポジトリ
  • コミュニティガイドライン
  • コミュニケーション
    コミュニティの構造
    プロジェクトリーダー
    コアチーム
    コードオーナー
    ライセンス
    Runtime Library Exception (実行時ライブラリ例外)
    ソースコードの著作権とライセンス
    投稿
    入門
    コードの貢献 (投稿)
    新しい機能の提案
    行動規範
    投稿者行動規範 v1.3
    報告
    メーリングリスト
    General Interest
    Swift 開発
    Swift の発展
    通知
  • 投稿
  • 質問に答える
    バグを報告する
    バグのトリアージ
    コードの投稿
    段階的な開発
    メッセージをコミットする
    変更の帰属
    コードテンプレート
    コードのレビュー
    テスト
    品質
    コミットアクセス
    外部ライブラリ依存関係の追加
    Swift 発展プロセスへの参加
    LLVM と Swift
    LLVM の変更はどこで行われますか?
    Swift と LLVM 開発者ポリシー
  • Swift の継続的インテグレーション
  • 構成
    ジョブの組織
    ジョブの構成
    使用法
    リクエストのテスト
  • Swift ソースの互換性
  • プロジェクトの現在のリスト
    プロジェクトの追加
    合格基準
    プロジェクトの追加
    プロジェクトの維持
    リクエストのテスト
    プロジェクトをビルドする
    フォーカスエリア
  • ABI の安定性
  • データレイアウト
    メタデータ型
    切り分け
    呼び出し規約
    実行時
    標準ライブラリ
  • サーバーAPIプロジェクト
  • フォーカスエリア
    移植性
    外部ライブラリの使用
    ワークグループ
    舵取りチーム
    ステークホルダー
    開発プロセス
    API の提案
    プロトタイプ化と開発
    リリースプロセス
    メーリングリスト
  • コンパイラと標準ライブラリ
  • コンパイラのアーキテクチャ
    標準ライブラリの設計
  • パッケージマネージャ
  • 概念の概要
    モジュール
    パッケージ
    製品
    依存関係
    例の使用法
    ライブラリパッケージの作成
    ビルド構成文の使用
    依存関係のインポート
    副依存関係の解決
    コミュニティの提案
  • Swift コアライブラリ
  • プロジェクトの状態
    Foundation
    libdispatch
    XCTest
  • REPL とデバッガ、プレイグラウンド
  • なぜ REPL とデバッガを組み合わせるのか?
    Xcode プレイグラウンドサポート












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)