2
Help us understand the problem. What are the problem?

posted at

updated at

firestoreを使ったswiftのCodableを作る時に使う@DocumentIdに隠された便利機能を見つけてしまった

こんにちは。virapture株式会社でCEOしながらラグナロク株式会社でもCKOとして働いているもぐめっとです。

本日はswiftとFirestoreで使う@DocumentIdについて皆が知らないであろう機能を発見したので共有します。

@DocumentIDとは?

そもそも@DocumentIDってなんやねんというお話をすると、Decodeするときに自動的にidを付加するという便利機能になります。

import FirebaseFirestoreSwift

struct UserModel: Codable {
    @DocumentID var documentID: String?
    let username: String
}

Firestore.firestore().document("users/mogmet").getDocument { snapshot, error in
    let user = try? snapshot?.data(as: UserModel.self, with: .estimate)
    //これだけでuser.documentIDにdocumentIdが入っている
}

参考↓

隠された便利機能ってなに?

もぐめっとは、名前からしてDocumentIDとあるのでIDしか付与できないと思ってました。
しかし、DocumentIDの処理をみると、DocumentReferenceを値として持ってるように見えました。

そのため、ためしにこう書いてみました。

import FirebaseFirestoreSwift

struct UserModel: Codable {
    @DocumentID var documentID: String?
    @DocumentID var reference: DocumentReference?
    let username: String
}

すると、DocumentReferenceの値もちゃんと保管されていることを確認できました!!!
これはすごい!便利!!!

補足

ちなみにこういう書き方もできます。

Firestore.firestore().document("users/mogmet").getDocument { snapshot, error in
    let user = try? Firestore.Decoder().decode(UserModel.self, from: snapshot.data(with: .estimate), in: snapshot.reference)
}

この場合はin句でreferenceを入れてあげないと@DocumentIDが動かないので注意ください。
(でも最初の書き方のほうがシンプルなのでconverterを指定しないかぎりはこっちの書き方は使わなそう)

まとめ

@DocumentIDはDocumentReferenceもいい感じに保管してくれる便利機能でした!!

最後に、ワンナイト人狼オンラインというゲームを作ってます!よかったら遊んでね!

他にもCameconOffchaといったサービスも作ってるのでよかったら使ってね!

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています!!楽しくぶち上げたい人はぜひお話ししましょう!!

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
2
Help us understand the problem. What are the problem?