Xcode 8.3・Swift 3.1が正式リリースしたので早速アップデートしました
本日3月28日、Appleの各種OSおよびXcodeの正式アップデートが来たので、早速Xcode 8.3・Swift 3.1にアップデートしてみました。スクショの通り、入れている Xcode は 8.3 のみで、スッキリです( ´・‿・`)
ついでに、こういう改善もセットでなされました:
Swift 3.1 の変更については、少し前の記事ですが、以下にまとめた内容と大差ありません。
個人的には、こちらのジェネリクスの制限緩和が嬉しいです( ´・‿・`)
公式記事も上がっています:
既存プロジェクトのXcode 8.3・Swift 3.1対応
元々、最新のXcode 8.2・Swift 3.0.2 などで開発していた場合、コード追従はほとんどせずに対応できるはず(ごくマイナーな破壊的変更は含まれています)で、僕の環境では数行直す程度でビルドが通りました🎉まったく対応不要のケースも多いと思います。
Carthageを使っている場合は、以下のコマンドなどでライブラリのリビルドも必要です(ABI安定がまだなされていないため)。
carthage update --platform iOS
ビルド済みバイナリ配布形式になっているライブラリの場合、 --no-use-binaries
オプション指定も必要で、僕の利用しているものでは以下がそれに該当しました。
…と思いきや、Carthage 0.20 以上であれば、 --no-use-binaries
オプション指定せずとも、Swiftバージョン不合致の時は自動的にビルドして解決してくれるようになっていました👏
Facebook SDKで躓いた
また、上に書いたとおり、コード対応自体は不要ではあったものの、実はfacebook/facebook-ios-sdk をCarthage で取り込んでいたものがビルド通らなくなってしまいました。これはObjective-C製だったのでリビルド不要のため、Carthageでの依存を消して以前ビルドしたものを使うことで一旦プロジェクトのビルド自体は通るようになったのですが、今後以下のどれかの対応が必要ですね( ´・‿・`)
- 今後解決されるのを待つ → 【追記】facebook-ios-sdk 4.21.0とXcode 8.3.1の組み合わせでビルド出来ました🎉
- Carthage から CocoaPods に変更
- facebook/facebook-sdk-swift に変更
Swift 3.0 対応は大変でしたが、その後の3系のアップデートは基本的に破壊的変更なく、3.0 にそれらが押し込められて対応大変だった甲斐がありましたね( ´・‿・`)
CIサービスもBitriseなら安心
CIサービスは、TravisCI・CircleCIが有名どころですが、僕はBitrise愛用しています。アップデート追従が極めて速いので、安心して利用出来ます。
Swift 2.3でしのいでた場合は対応大変
以前から予告されていた通り、Xcode 8.3ではSwift 2.3サポートが切られました。Swift 3対応を先延ばしにしていた場合、がんばって対応するかXcode 8.2までをまだ使い続けるしかありません( ´・‿・`)
Xcode 8.3 no longer supports Swift 2.3. Please migrate your projects containing Swift 2.3 code to Swift 3 syntax by opening the project and choosing Edit > Convert > To Current Swift Syntax.
Xcode 8.3が生成するバイナリサイズが大きくなってしまうバグ?
Xcode 8.3が生成するバイナリには非常に大きなビットコードが含まれ、以前のバージョンと比べて4倍以上のサイズになってしまいました
そのためiOS版のRealm Objective-Cフレームワークは通常の55MBほどのサイズから158MBになってしまいました。そのためObjective-Cフレームワークは引き続きXcode 8.2を利用してビルドすることにしました。
Xcode 8.3でビルドしたフレームワークを利用するにはソースコードからビルドしてください。App Storeから配信される際にビットコードは削除されるので、エンドユーザーにはバイナリサイズによる影響はありません。
とのことなので、ちょっと注意ですね。
もちろんRealmライブラリに限らない問題で、人によってはCI周りで困ることも(自分の場合けっこう困りました)。
【追記】Xcode 8.3.1で修正されました
Fixed an issue that could produce app archives that were larger than necessary. Support for app archives built in Xcode 8.3 will be deprecated. (31302382)
僕もgit lfs使わない以前通りのやり方に戻しました🐶
Fastlaneの対応
以下の変更が必要のようです。
use_legacy_build_api
を指定していた場合はカットexport_method
を指定
ちなみにSwift 4対応はどうなりそうか?
3系で入れないようにしていた破壊的変更は、Swift 4 に持ち越されているのですが、以下のように充分ケアされているので、Swift 3対応の大変さの再来にはならないと見ています。
- 破壊的変更について、3より遙かに慎重に選択されていて限定的になっている
-swift-version
フラグでの3互換モードビルドオプションが用意され、3と4のアプリコードとライブラリが混在した状態でもリンクできるようになる模様