#思い立ったが吉日
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の末尾に書いておく。
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/を一回消す。