Xcode
iOS
Swift
Carthage
iPhoneX

[Swift]Xcode9系への移行を最小限の変更で行う

前書き

いずれは対応します!と伸ばし伸ばしにしていましたが、、、
急遽、上からの指示でiphone X 対応を迫られ、現状Xcode8.3.3だったのでどうしたものかと笑

ということで、やったりました。

移行

目的

今回は、一旦ビルドができ、アプリが起動するまでが目標です。(iphoneXで)
なので、黄色い警告がたくさん出ていようが、、、、関係ない!笑

現状

Xcode 8.3.3
Swift 3.0

導入に当たって

移行に当たって、まずXcodeを9に上げたからといって、Swift4にする必要はありません

こちら(Xcode 9を使うときの注意点)から抜粋しますが、

Xcode9では新しいバージョンであるSwift 4と、Swift 3系と互換性のあるSwift 3.2の両方が使える

つまり、Xcode9でもSwift3.2ならおっけー(互換性ある)やないかーい!ということです。
(結局Swift4への対応を先延ばしにしているだけですが笑)

実作業

①Xcode9系のダウンロード

念のため移行失敗のために、古いXcodeを残しておきたい人は
こちら(複数バージョンのXcodeを共存させる)をご覧ください。

AppStore または Apple Developer からダウンロードしてインストール。

※ちなみに自分はXcode9.1を入れました。

②Xcodeを起動

こちら(Swift 4 マイグレーション、またはXcode9対応 メモ)を参考にするとわかりやすいです。

起動して、左側をみると、、、バージョンアップして、何個か増えています。
スクリーンショット 2017-11-14 1.57.34.png

その中の、前から存在する三角形の奴をクリック。
すると,Warningがいくつか出てるかと思いますが、トップの2つが

1.
Swift Conversion
  Convertion to Swift 4 is available
2.
Validate Project Settings
  Update to recommended settings

のはずです。上をクリックして実行してしまうと、Swift4対応なってしまうので絶対に実行しないでください
(今回は最小限の移行に抑えるため)

とりあえず、下をクリックして、そのまま何回かポチポチすると実行されます。
(各種コンパイル時のwarningが出てきます)

③再ビルドと修正

再ビルドを行うと、ほぼほぼどこかで失敗するはずなので、それを潰していきます。
個人的に遭遇したものを列挙していきます。

1.ライブラリの非対応エラー

ライブラリエラーが出た場合は、まず入れ直すのが前提なのですが、
例えば、ObjectMapperを例にとれば、carthageで導入しており、移行前は

github "Hearst-DD/ObjectMapper" ~> 2.2

となっていました。しかし、carthage updateで見事に撃沈、、、

対応方法

ここで公式Githubのブランチを見てみると、、、対応ブランチがありました。

スクリーンショット 2017-11-14 2.11.25.png

ということで

github "Hearst-DD/ObjectMapper" "swift-4"

無事、carthage が通りました。

上記のように、個々の導入しているライブラリに対応用のブランチがないか探して見てください。あれば、後ろにブランチ名を指定してあげれば解決です!
ない場合は、自分で直すかorライブラリ撤廃を検討してください、、、。

2.対応端末(アーキテクチャ)の不一致

まずをこちらを御一読いただけると、、、
デバイスのアーキテクチャについてのまとめ

簡単に言うと、端末によって対応しているアーキテクチャーなるものが存在しており、それが網羅されていないと起きるエラーです。

古いライブラリでは、古い端末(armv7、armv7sなど)に対応しているため、既存のアプリが最新のアーキテクチャーしかビルド範囲にない場合、新しくビルドしようとするとエラーが発生することがあります。

以下、BuildSetting > All で確認出きます。
スクリーンショット 2017-11-14 2.24.17.png

対応方法

自力で行う場合は、
1、ライブラリをフォークして自分のリポジトリにする。
2、フォークしたリポジトリのクローン。
3、修正ブランチを適当に切る。(切らなくてもいいですが)例としてfeature/support_for_xcode9みたいな
4、ライブラリのプロジェクトを起動。
5、BuildSetting > Allの Valid Architecturesを自分のプロジェクトと同じにする
6、修正部分をプッシュ。
7、プッシュしたリポジトリを参照する。carthageの場合は 

github "ライブラリ名" "feature/support_for_xcode9"

carthage update で解決します。

3.予約語のバッティング

上記のリンクにもありましたが、導入しているライブラリと、新しく入ってきたクラス名がバッティングすることがあります。

例として
- Decodable

がその一つです。ライブラリで HimotokiArgo を使用している場合はバッティングします。

対応方法

今まで使用していた

Decodable

Argo.Decodable

と、ライブラリ名の後、書くように対応してください。

後書き

Swift4にしないので、最小限の変更で、赤い警告さえなんとかなればいけるかと思います。
ビルドエラー時も、エラーログを読めば潰せないものはないはず!!

シュミレータにiphoneXも追加され、LaunchImageも新規作成すればiphoneX 用のものが追加できているはずです!

では、楽しいXcodeライフを!