Xcode 8とiOS 10が正式に公開されました。Swift 2からSwift 3への移植は結構大変という前評判だったので、ボチボチ手をつけていくかぁ……とSwift 3対応を始めたもののすぐに詰まってしまいました。
最近作っているikatomoもPokétomoも、両方ともデータを保存するのにRealmSwiftを使っています。
どうもそのRealmSwiftで大量のビルドエラーが出てしまっているようでした。
Xcode 8とSwift 3でRealmSwiftをビルドできるようにした
先にビルドを通せた方の書き方をPodfileを紹介します。
RealmSwiftのSwift 3.0対応はmasterブランチで実装中のようです。pod 'RealmSwift'
という書き方ではなくてgitからcloneしてきました。
target 'realm_sample' do use_frameworks! pod 'Realm', :git => 'https://github.com/realm/realm-cocoa.git', :submodules => true pod 'RealmSwift', :git => 'https://github.com/realm/realm-cocoa.git', :submodules => true end post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['SWIFT_VERSION'] = "3.0" end end end
CocoaPodsにRealmSwiftのSwift 3対応版が降ってくるのはまもなくのようです。
We'll be revising our Swift 3 API in the coming days and making an official release late next week!
— Realm (@realm) 2016年9月7日
RealmSwiftのビルドが通らない!
ここから先は失敗談なので読む必要はありません。
どういう風につまづいたのかをメモしておきます。一番最初にPodfileはこんな書き方をしていました。
target 'realm_sample' do use_frameworks! pod 'Realm', :git => 'https://github.com/realm/realm-cocoa.git', :submodules => true pod 'RealmSwift', :git => 'https://github.com/realm/realm-cocoa.git', :submodules => true end
これでpod install
をしてxcworkspaceを開くと、下図のようにSwift 3へのコンバートを促されます。
Swift 2.3からSwift 3.0へコンバートしますか?と聞かれるのでそのまま進めていくと……大量にエラーが発生してしまいます(エラーが多いので一部だけ) 。
/Pods/RealmSwift/RealmSwift/LinkingObjects.swift:125:29: Extraneous argument label 'index:' in call /Pods/RealmSwift/RealmSwift/LinkingObjects.swift:137:29: Extraneous argument label 'index:' in call /Pods/RealmSwift/RealmSwift/LinkingObjects.swift:149:29: Extraneous argument label 'index:' in call /Pods/RealmSwift/RealmSwift/List.swift:91:29: Extraneous argument label 'index:' in call /Pods/RealmSwift/RealmSwift/List.swift:103:29: Extraneous argument label 'index:' in call /Pods/RealmSwift/RealmSwift/Results.swift:129:29: Extraneous argument label 'index:' in call /Pods/RealmSwift/RealmSwift/Results.swift:141:29: Extraneous argument label 'index:' in call /Pods/RealmSwift/RealmSwift/Results.swift:153:29: Extraneous argument label 'index:' in call
実際にコードを見てみると下記のように分岐されていました。何かで定義されている値を見て判断しているのではないかと推測しました。
#if swift(>=3.0) #else #endif
configにconfig.build_settings['SWIFT_VERSION'] = "3.0"
を指定すようにしたらビルドが通るようになりました。
poketomoのSwift 3.0対応はライブラリの関係で簡単にできそうにないというのが分かったので週末やろう……
— さくさん (@ch3cooh) 2016年9月14日