Xcode 8.3・Swift 3.1が正式リリースしたので早速アップデートしました

mono 
Swift・iOSコラム
10 min readMar 27, 2017

--

本日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愛用しています。アップデート追従が極めて速いので、安心して利用出来ます。

当然のようにXcode 8.3が選択できるようになっています

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のアプリコードとライブラリが混在した状態でもリンクできるようになる模様

--

--