

**質問内容**  
SwiftUIによるFirestoreへのデータの保存と取得について勉強中です。  
カスタムオブジェクトを保存し、取得するテストコードを書いてみましたが、以下のエラーに対処できません。  
Firebaseの公式ドキュメントに掲載されているものを使ってみましたが、どのように修正したら良いでしょうか。  
エラー内容はコード内にコメントとして追記しています。

**テストコード**

[code]

    import SwiftUI
    import Firebase
    
    struct ContentView: View {
        
        let savedata = SaveData(savename: "保存名です", savedate: Date(), savedataarray: ["保存するデータA", "保存するデータB", "保存するデータC"], saveint: 123)
        @State private var savedata_fromFirebase = SaveData(savename: "", savedate: Date(), savedataarray: ["初期表示A", "初期表示B", "初期表示C"], saveint: 0)
        
        var body: some View {
    
            VStack {
                //-------------------------------------------------------------------------
                Button(action: {
                    let db = Firestore.firestore()
                    do {
                        //Cannot convert value of type 'SaveData' to expected argument type '[String : Any]'
                        //Extraneous argument label 'from:' in call
                        try db.collection("collectionnameY").document("docmentnameY").setData(from: savedata)
    
                    } catch let error {
                        print("Error writing savedata to Firestore: \(error)")
                    }
                }){
                    Text("カスタムオブジェクトをFirestoreに保存")
                        .border(Color.green, width: 1)
                }
                //-------------------------------------------------------------------------
                Button(action: {
                    let db = Firestore.firestore()
                    let docRef = db.collection("collectionnameY").document("docmentnameY")
                    docRef.getDocument { (document, error) in
                        let result = Result {
                          try document?.data(as: SaveData.self)//Argument passed to call that takes no arguments
                        }
                        switch result {
                        case .success(let savedata):
                            if let savedata = savedata {
                                print("SaveData: \(savedata)")
                            } else {
                                print("Document does not exist")
                            }
                        case .failure(let error):
                        print("Error decoding savedata: \(error)")
                        }
                    }
                }){
                    Text("Firestoreからカスタムオブジェクトを取得")
                    .border(Color.green, width: 1)
                }
                //-------------------------------------------------------------------------
                Text("カスタムオブジェクトを取得したら表示は更新される（以下）")
                Text("\(savedata_fromFirebase.savename!)")
                Text("\(savedata_fromFirebase.savedate!)")
                //Instance method 'appendInterpolation(_:formatter:)' requires that '[String]?' inherit from 'NSObject'
                Text("\(savedata_fromFirebase.savedataarray)")
                Text("\(savedata_fromFirebase.saveint!)")
            }
    
        }
    }
    
    struct SaveData: Codable {
        let savename: String?
        let savedate: Date?
        let savedataarray: [String]?
        let saveint: Int?
        
        enum CodingKeys: String, CodingKey {
            case savename
            case savedate
            case savedataarray
            case saveint
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    
[/code]


CC BY-SA 4.0
2021-05-20T08:21:24.673
75978
2021-05-26T05:59:03.293
45415
question
swift firebase swiftui
SwiftUIでFirebaseにカスタムオブジェクトを保存する方法について


アドバイス頂いた内容から、SwiftUIでカスタムオブジェクトをFirebaseに保存することができるようになりましたので、簡潔に手順をまとめておきます。

1.  
XcodeでSwiftUIにチェックを入れて新規プロジェクト作成  
ファイル名App.swift と ContentView.swift の２つがデフォルトで作成されているはずです。

2.  
X-codeで、  
→File  
→Swift Packages  
→Add Package Dependency...  
→ URLに https://github.com/firebase/firebase-ios-sdk.git と入力  
→firebase、firebasefirestore、firebasefirestore-swiftの３つをインストール（時間かかります）

3.  
Firebaseの公式サイトに行き、アプリを登録（Firebaseで自分のアカウントは作成済の前提で話を進めます）  
※公式サイトのガイドに従って登録を進めていくと、CocoaPodsを使ってインストールするようにという説明が出ますが無視して次へで大丈夫です

4.  
ファイル名App.swiftを以下のように書き換えます。

[code]

    import SwiftUI
    import Firebase//追記
    import FirebaseFirestoreSwift//追記
    import FirebaseFirestore//追記
    
    @main
    struct test_Firebase5App: App {
        //追記（ここから）
        init() {
            FirebaseApp.configure()
        }
        //追記（ここまで）
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    
[/code]

  5. 

同様に、firebaseを利用したいファイルに、

[code]

    import Firebase//追記
    import FirebaseFirestoreSwift//追記
    import FirebaseFirestore
    
[/code]

を付け足す。

以上です。  
ご不明点あればコメントください。（回答者自身も苦戦してよくわかっていない部分も多いので、有益な回答はできないかも知れません。。）  
SwiftPackageManagerを使うと、Cocoapodsよりも手順が少なく済み、個人的には便利だと感じました。


CC BY-SA 4.0
2021-05-26T05:51:40.680
76073
2021-05-26T05:59:03.293
2021-05-26T05:59:03.293
45415
45415
75978
answer