酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Swift3.0でRealmSwiftのビルドが通らない

Xcode 8とiOS 10が正式に公開されました。Swift 2からSwift 3への移植は結構大変という前評判だったので、ボチボチ手をつけていくかぁ……とSwift 3対応を始めたもののすぐに詰まってしまいました。

最近作っているikatomoPoké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対応版が降ってくるのはまもなくのようです。

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へのコンバートを促されます。

f:id:ch3cooh393:20160915012222p:plain

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"を指定すようにしたらビルドが通るようになりました。