

現在、パスワード管理アプリを制作しています。  
入力された値をfirestoreに追加して、TableViewに表示するところまでできました。  
次に、選択されたTableViewのセルを削除する機能を製作中なのですが、その時にfirestoreのデータ（ドキュメント）も削除したいです。

[公式ドキュメント](https://firebase.google.com/docs/firestore/manage-data/delete-
data?authuser=0) の通りにドキュメントを削除するコードを書いてみたのですが、ドキュメントIDの取得方法がわかりません。

[code]

    import UIKit
    import Firebase
    
    class MypageViewController: UIViewController, UITableViewDelegate {
        
        
        var displayData: [Data] = []
        
        let db = Firestore.firestore()
        
        @IBOutlet weak var tableView: UITableView!
        @IBOutlet weak var emailLabel: UILabel!
        override func viewDidLoad() {
            super.viewDidLoad()
            
            tableView.delegate = self
            tableView.dataSource = self
            self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
            emailLabel.text = Auth.auth().currentUser?.email
            db.collection("passwordData").getDocuments() { (querySnapshot, err) in
                if let err = err {
                    print("Error getting documents: \(err)")
                } else {
                    for doc in querySnapshot!.documents {
                        let data = doc.data()
                        if let recorder = data["recorder"] as? String, let service = data["service"] as? String, let password = data["password"] as? String {
                            if recorder == Auth.auth().currentUser?.email {
                                let cellData = Data(title: service, password: password, recorder: recorder)
                                self.displayData.append(cellData)
                                print(self.displayData)
                                DispatchQueue.main.async {
                                    self.tableView.reloadData()
                                    let indexPath = IndexPath(row: self.displayData.count - 1, section: 0)
                                    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
                                }
                            }
                        }
                        
                    }
                }
            }
        }
        
        func selectRow(at indexPath: IndexPath?, animated: Bool, scrollPosition: UITableView.ScrollPosition) {
            print(indexPath)
            print("選択されました")
        }
        
    }
    
    extension MypageViewController: UITableViewDataSource {
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.displayData.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let passwords = displayData[indexPath.row]
            
    //        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
            let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell")
            cell.textLabel?.text = passwords.password
            cell.detailTextLabel?.text = passwords.title
            return cell
        }
        
        func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
            {
                return true
            }
        func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
            
            let id: Data = self.displayData[indexPath.row]
            
            
            if editingStyle == UITableViewCell.EditingStyle.delete {
                displayData.remove(at: indexPath.row)
                tableView.deleteRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
                db.collection("displayData").document("ここのIDの取得方法を教えていただけませんか？").delete() { err in
                    if let err = err {
                        print("Error removing document: \(err)")
                    } else {
                        print("Document successfully removed!")
                    }
                    print(id)
                }
    
            }
        } 
    }
    
[/code]

入力されたデータは、以下のコードでfirestoreに追加しています。

[code]

    struct Data {
        var title: String
        var password: String
        var recorder: String
    }
    
    if let title = titleText.text, let password = diaryText.text, let account = Auth.auth().currentUser?.email {
                var ref: DocumentReference? = nil
                ref = db.collection("passwordData").addDocument(data: [
                    "recorder": account,
                    "service": title,
                    "password": password,
                ]) { err in
                    if let err = err {
                        print("Error adding document: \(err)")
                    } else {
                        print("succesfully!")
                    }
                }
            }
    
[/code]


CC BY-SA 4.0
2021-06-22T06:55:19.750
77696
2021-06-22T23:09:30.677
2021-06-22T15:26:52.077
3060
46975
question
swift xcode firebase
tableViewのセルを削除する際にfirestoreのドキュメントも削除したいのですが、ドキュメントIDの取得方法がわかりません。


各ドキュメントを表すデータ型(あなたの場合`Data`、Swiftの標準ライブラリにある型名と全く同じ型名の定義があるとつまらないことで引っかかる可能性があるので、以下では`PasswordData`に変更してあります)に`documentID`を表すプロパティを追加するのが確実で簡単だと思います。

あなたのコードでは`FirebaseFirestoreSwift`モジュールをimportすると使えるようになる「カスタムオブジェクト」の機能は使っていないようなので、素直に`documentID`を取得して、所定のプロパティに設定してやるだけです。

[code]

    struct PasswordData {
        var documentID: String
        var title: String
        var password: String
        var recorder: String
    }
    
[/code]

[code]

            db.collection("passwordData").getDocuments() { (querySnapshot, err) in
                if let err = err {
                    print("Error getting documents: \(err)")
                } else {
                    for doc in querySnapshot!.documents {
                        let documentID = doc.documentID //<-
                        let data = doc.data()
                        if let recorder = data["recorder"] as? String,
                           let service = data["service"] as? String,
                           let password = data["password"] as? String
                        {
                            if recorder == Auth.auth().currentUser?.email {
                                let cellData = PasswordData(
                                    documentID: documentID, //<-
                                    title: service,
                                    password: password,
                                    recorder: recorder)
                                //...
                            }
                        }
                    }
                }
            }
    
[/code]

このようにしておけば、削除の時には削除される要素から`documentID`を取り出すだけです。

[code]

            let removed = displayData.remove(at: indexPath.row)
            let documentID = removed.documentID
            //... `documentID`を使った削除処理
    
[/code]


CC BY-SA 4.0
2021-06-22T23:09:30.677
77719
2021-06-22T23:09:30.677
13972
77696
answer