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

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

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

# 移行

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

## 現状
Xcode 8.3.3
Swift 3.0

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

こちら（[Xcode 9を使うときの注意点](https://project-flora.net/2017/09/22/xcode-9%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9/)）から抜粋しますが、
> Xcode9では新しいバージョンであるSwift 4と、Swift 3系と互換性のあるSwift 3.2の両方が使える

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

## 実作業

### ①Xcode９系のダウンロード
念のため移行失敗のために、古いXcodeを残しておきたい人は
こちら([複数バージョンのXcodeを共存させる](https://hacknote.jp/archives/25387/))をご覧ください。

[AppStore](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12) または [Apple Developer](https://idmsa.apple.com/IDMSWebAuth/login?appIdKey=891bd3417a7776362562d2197f89480a8547b108fd934911bcbea0110d07f757&path=%2Faccount%2F&rv=1) からダウンロードしてインストール。

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

### ②Xcodeを起動

こちら（[Swift 4 マイグレーション、またはXcode9対応 メモ](https://qiita.com/yokomotod/items/cc808417012daf1d7316)）を参考にするとわかりやすいです。

起動して、左側をみると、、、バージョンアップして、何個か増えています。
<img width="348" alt="スクリーンショット 2017-11-14 1.57.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/175242/5f40c6bf-ff76-ccc7-f9bd-5f876091593d.png">

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

```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のブランチを見てみると、、、対応ブランチがありました。

<img width="1063" alt="スクリーンショット 2017-11-14 2.11.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/175242/65b46e23-2990-d110-bfa3-0c16f93fa4fb.png">

ということで

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

無事、carthage が通りました。

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

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

まずをこちらを御一読いただけると、、、
[デバイスのアーキテクチャについてのまとめ](https://blog.ymyzk.com/2015/12/ios-tvos-watchos-architectures/)

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

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

以下、``BuildSetting > All`` で確認出きます。
<img width="481" alt="スクリーンショット 2017-11-14 2.24.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/175242/26d8a85f-3a16-04f8-a4e3-17f1f4d0a454.png">

##### 対応方法
自力で行う場合は、
１、ライブラリをフォークして自分のリポジトリにする。
２、フォークしたリポジトリのクローン。
３、修正ブランチを適当に切る。（切らなくてもいいですが）例として``feature/support_for_xcode9``みたいな
４、ライブラリのプロジェクトを起動。
５、``BuildSetting > All``の　``Valid Architectures``を自分のプロジェクトと同じにする
６、修正部分をプッシュ。
７、プッシュしたリポジトリを参照する。carthageの場合は　

```
github "ライブラリ名"　"feature/support_for_xcode9"
```
で``carthage update`` で解決します。

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

上記の[リンク](https://qiita.com/yokomotod/items/cc808417012daf1d7316)にもありましたが、導入しているライブラリと、新しく入ってきたクラス名がバッティングすることがあります。

例として
- Decodable

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

##### 対応方法

今まで使用していた

```
Decodable
```

を

```
Argo.Decodable
```

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

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

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

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