Xcode
iOS
Swift
Xcode8
swift3
More than 1 year has passed since last update.


思い立ったが吉日

Swift3.0に対応してないpodは徹底的に切っていく姿勢でXcode8+Swift3に対応することにした。


Cocoapods update

色々互換性の修復がされているので1.1.0.rc.2を入れる

gem install -v 1.1.0.rc.2 cocoapods

もしくはGemfileで管理している場合は

gem 'cocoapods', '~> 1.1.0', '>= 1.1.0.rc.2'

とかに変えて

bundle update


Podfile

ライブラリのコンパイルに使用するSwiftバージョンを固定しておく。必須では無いが、恐らくライブラリ側でコンパイラの指定がされていないとコンパイルに失敗するのでPodfileの末尾に書いておく。


Podfile

post_install do |installer|

installer.pods_project.targets.each do |target|
target.build_configurations.each do |configuration|
configuration.build_settings['SWIFT_VERSION'] = "3.0"
end
end
end


ライブラリをSwift3.0版に変更する

基本的に、メインストリームのブランチがswift3.0に対応しているのであれば

pod 'Alamofire'

のように指定すれば良い。

とりあえず全てこの形にしてみて(プライベートリポジトリのpodを使っている場合は指定を消さないように注意)

pod update

する。

そのままworkspaceを開いてビルドする。通れば良いが、ライブラリ側でエラーが出ることがある。

特にOptionalやシンタックスのエラーの場合はSwift2.3のライブラリである可能性が高いのでSwift3.0に対応したコミットを探す


Swift3.0対応版の探し方

基本的にGithubを見に行く。

ブランチ一覧を見てみてswift3やswift/3.0、swift-3.0と言ったそれっぽいブランチがあれば、

pod 'Hoge', git: 'git@git.com/hoge', branch: 'swift3'

のように書き換える。

そこにない場合は、release一覧をみてみる。

最新版がbetaでまだcocoapodsにpushされていない場合はここにあるので

pod 'Hoge', git: 'git@git.com/hoge', tag: '1.2.0'

のようにタグを指定する。

そこにもない場合はforkして自分で対応させる。


プロジェクトの3.0対応

大変(事務作業的な意味で)、ビルド通すのに丸1日かかってしまった…。

コンバートは何も変換してくれなかった、あとで気がついたけどたぶんコンバート中にSourceKitがクラッシュしたからかもしれない。

変更箇所の一例をあげると

・indexOf(hoge)のようなメソッドがindex(Of:hoge)になった

・enumは.Lightが.lightのように小文字から始まるようになった

・NSHogehogeがHogehogeに変わった(NSが取れた)

・dispath_queue系がDispatchQueueクラスになった

・fileprivateやopenといった装飾が増えた

などなど、基本的にビルドして詰まったらそこを修正+正規表現でプロジェクト全体に反映の流れ。

これにプラスしてライブラリの変更にも対応する。(RxCocoaならrx_tapがrx.tapになった等


メソッド名

メソッド名やラベルなどSwift3.0のような名前にする。まだやってない。

http://dev.classmethod.jp/smartphone/iphone/swift3_0046_first_label/

とかを見てやる。


名前空間

例えばObservableという名前はBondもRxSwiftも使っているので、

Bond.Observable

RxSwift.Observable

と表記すれば名前空間を使えると思うかもしれない。が、名前空間はフレームワーク名と同名クラスをもっている場合は効かなくなる。

そして、名前空間が効かない名前が他と被るとコンパイラが不安定になる。

今回はBondもRxSwiftも似たような機能なのでRxSwiftに統合した


fix集


enumの先頭は小文字

  enum ErrorCode: Int {

case Unknown = -1
case Default = 0
case ForceUpdate = 1009
}

  enum ErrorCode: Int {

case unknown = -1
case `default` = 0
case forceUpdate = 1009
}

defaultは予約語だから``で囲う


Edit all in scopeショートカット

範囲選択して⌘+Ctr+E

http://stackoverflow.com/questions/17115413/what-s-the-shortcut-for-edit-all-in-scope-in-xcode

手でやったほうが早いかも


Xcode8.1beta

Xcode8はコンパイルが途中で止まる事があったけどXcode8.1betaにしたらわりとスムーズになった

あとコメントアウトも出来るようになった


~/Library/Developer/Xcode/DerivedData/

Xcodeのバージョンが上がるとゴミが悪さをすることがあるので、~/Library/Developer/Xcode/DerivedData/を一回消す。