Edited at

公式の方法でFirestoreでCodable #firebase #firestore #codable

FirebaseのNoSQLであるFirestoreはiOS上で利用する場合、基本的に NSDictionary 型でやり取りしていました。

例としては

// Documentの追加

let data = ["key": "value"]
let ref = Firestore.firestore().collection("hoge").addDocument(data: data) { error in
if error == nil {
let documentID = ref.documentID
// something todo
}
}

// Documentの取得

let documentID = ...
Firestore.firestore().collection("hoge").document(documentID).getDocuments { (snapshot, error) in
guard let data = snapshot?.data() else { return }
let value = data["key"]
// something todo
}

こんな感じだったかと思います。


Codable

Swiftには4からCodableという機能が導入されました。

FirestoreがJSON形式のData型でやり取りしてくれたらCodableが利用出来るのになと何度考えた事か...

そこでalickbass/CodableFirebaseというライブラリを利用していた方も多かったのでは?

そんな中、公式の方法でCodableが利用出来る様になっていました。

まだ、公式のCocoaPodsには登録されて無い様なので、利用する方法としては@yimajoさんのTweetを参考するのが良さそうです。

Podfileに

pod 'Firebase/Core'

pod 'Firebase/Firestore'
pod 'FirebaseFirestoreSwift', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'

としてpod installでインストールが完了です。


使い方

使い方は

import FirebaseFirestoreSwift を記述して、エンコーダーはlet encoder = Firestore.Encoder()、デコーダーはlet decoder = Firestore.Decoder()を利用します。

後はJSONEncoder/Decoderなどと同様に利用する事が可能です。

alickbass/CodableFirebaseを利用していた方は

- import CodableFirebase

+ import FirebaseFirestoreSwift

- let decoder = FirestoreDecoder()

+ let decoder = Firestore.Decoder()

- let encoder = FirestoreEncoder()

+ let encoder = Firestore.Encoder()

の修正だけで良いので移行が簡単に可能です。


まとめ

個人的には利用する外部ライブラリが多いと依存が増えたり、アプリのサイズや起動時間に影響が出るのでなるべく控え、それでも利用しないといけない場合は、ある程度メンテが活発で公式にサポートがある物を選びたいなと思っていました。

今回は公式でサポートが増えたのがとても良いなと思いました。

また、これまで出来ないと思っていた事が出来る様になるのも嬉しいですね。