Posted at

Swift4.2から5へのマイグレーションでやったこと

最近自分のアプリでSwift4.2から5へのマイグレーションを実施したので、やったことをまとめておきます。

なお、使用しているパッケージマネージャはCocoaPodsのみです。


XCode10.2/Swift4.2で問題なく動作するようにする

まずはじめに、XCode10.2/Swift4.2でアプリが問題なく動作すること、テストがパスすることを確認しました。

このときはXCode10.2にしたタイミングでテストライブラリのNimbleがコンパイルエラーを起こしていたので、Nimbleをバージョンアップしました。

$ pod repo update

$ pod update Nimble

バージョンアップしたらコンパイルエラーは出なくなり、テストがパスしました。

Podfile.lockが変更されているので、ここで一旦コミットしておきます。


アプリのコードをSwift5へマイグレーションする

次に、Swift5へのマイグレーションを行っていきます。

XCodeが提供するマイグレーションツールによるマイグレーションは、アプリ本体のコードおよびテストコードにのみ実施します。

ライブラリのコードについては、Swift5に対応しているバージョンにアップデートするか、Swift4.2でビルドするように設定することで対応します。

マイグレーション実施前にPodfileに以下の設定を加えておきます。

これはライブラリをSwift4.2でビルドするという設定です。

post_install do |installer|

installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.2'
end
end
end

ここで一旦コミットしておきます。

続いて、Edit > Convert > Convert to current swift syntaxをクリックします。

以下のような画面が表示されるので、アプリターゲットとテストターゲットにのみチェックを入れてNextをクリックします。

スクリーンショット_2019_04_09_14_12.png

マイグレーション処理が開始されます。

image.png

今回は変更箇所がなかったらしく以下のような画面が表示されました。

Updateをクリックすると、project.pbxprojが更新され、Swift5でビルドする設定に変更されました。

image.png

ここでアプリが問題なく動作すること、テストがパスすることを確認しました。

なお、Swift5でEnumに一部変更があった関係でワーニングが出ていたので、それだけ修正しました。

ここでまたコミットしておきます。


ライブラリをバージョンアップする

アプリ本体のコードのマイグレーションが完了したので、次はライブラリをバージョンアップしてXCode10.2/Swift5に対応させます。

Podfileに追加していた設定をここで削除しておきます。

次に、ライブラリのバージョンアップを行います。

CocoaPodsのみでライブラリのバージョン管理を行っているので、以下のコマンドで全てのライブラリを一気にバージョンアップできます。

$ pod update

バージョンアップが完了したら、アプリが問題なく動作するか、テストがパスするかを確認します。

このときはコンパイルエラーも起こらず、アプリの動作も特に問題ありませんでした。

なお、ライブラリがまだSwift5に対応していないときは、Podfileに以下のような設定を加えることで、そのライブラリだけSwift4.2でビルドするということができます。

Swiftマイグレーションガイドに、Swift4.2と5でビルドしたターゲットは共存可能であると書かれています。

post_install do |installer|

installer.pods_project.targets.each do |target|
if ['RxSwift', 'RxCocoa'].include? target.name
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.2'
end
end
end
end


まとめ

Swift5へマイグレーションしたときの手順をご紹介しました。

自分は経験ないですが、Swift2→3、Swift3→4のマイグレーションに比べるとほとんど手間がかからなくなったようです。

今回はCocoaPodsだけを使っているプロジェクトの例でしたが、Carthageを使っていたり、Embedded Frameworkなど使ったりしていると、また違った手順になるんでしょうか。

もっとマイグレーション関連の記事がたくさん出るといいなと思います。


リファレンス