[Firebase]DatabaseのsnapshotでDecodeしよう!


こんにちは!コドン先生です今日はFirebaseの宣伝についてFirebaseでDatabaseを使用したことがある人なら誰でも知っているように、Firebaseはsnapshot形式でデータを送信します.スナップショットにはDictionary形式のデータが含まれています.

従来の方法


データベースに格納されているデータ


まず私のデータベースのデータを見せてあげましょう.私のDBにはuserという名前のセットの下のドキュメントがあります.ユーザー名はuserです.このドキュメントには、ユーザーの電子メール、名前、プロファイル写真url、プロファイルメッセージ、idが格納されます.

User Model


既存のメソッドを使用する場合、モデル構造は次のようになります.どうせ私は手動でデータを1つずつ入れますから、データベースのキーと属性の名前をつづる必要はありません.
struct User: Identifiable {
    let name: String
    let message: String
    let imageURL: String
    let email: String
    let id: String
}

データをインポートしてユーザー・オブジェクトを作成


既存の方法は次のとおりです.snapshotのデータをdictionaryとしてインポートし、各キーの値を1つずつ入力し、ユーザーの初期化器でオブジェクトを作成する必要があります.
func fetchUser(id: String) {
    COLLECTIONS_USERS.document(id).getDocument { snapshot, _ in
        guard let dictionary = snapshot?.data() else { return }
        
        guard let name = dictionary["name"] as? String else { return }
        guard let profileMessage = dictionary["profileMessage"] as? String else { return }
        guard let profileImageURL = dictionary["profileImageURL"] as? String else { return }
        guard let email = dictionary["email"] as? String else { return }
        guard let uid = dictionary["uid"] as? String else { return }
                
        let user = User(name: name, message: profileMessage, imageURL: profileImageURL, email: email, id: uid)
    }
}

FirebaseFirestoreSwiftの利用方法


新しいFirebase機能を利用して、上記のプロセスをより簡単にしましょう.

設定


Firebase SDKを初めてインストールする場合は、FirebaseFirestoreSWIFTをインストールする必要があります.(やっぱりベタバージョンですね.)

ユーザー・モデルの定義


モデルの定義も従来の方法とは異なるべきである.まず、協力可能な協定を守らなければならない.また、DBのkeyとpropertyの名前は同じでなければなりません.そうでなければCodingKeyで別に定義すべきでしょう?△私が先に同じことをします.
@DoumentIDというpropertyパッケージを宣言しますこのプロパティは、ドキュメントの名前自体を復号します.(この属性をオプションとして宣言してください!)
struct User: Identifiable, Codable {
    @DocumentID var id: String?
    let name: String
    let profileMessage: String
    let profileImageURL: String
    let email: String
}

データをインポートしてユーザー・オブジェクトを作成


Codable規格に準拠したオブジェクトが作成されましたので、Decodeでオブジェクトを作成します.JSONデータを受信して復号するように、Userオブジェクトを簡単に作成できます.
func fetchUser(id: String) {
    COLLECTIONS_USERS.document(id).getDocument { snapshot, _ in
        let user = try? snapshot?.data(as: User.self)
    }
}