LoginSignup
48
45

More than 5 years have passed since last update.

Xcode8+Swift3.0対応

Posted at

思い立ったが吉日

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/を一回消す。

48
45
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
45