首页 > 解决方案 > “删除信息”如果其值为空 Firestore Swift

问题描述

我有这段代码可以从 Firestore 获取信息:

struct Spty: Identifiable{
    var id: String
    var spty: String

    var r: NSNumber
    var g: NSNumber
    var b: NSNumber

}

class SptyViewModel: NSObject, ObservableObject{
    @Published var specialities = [Spty]()
    @Published var search = ""
    func fetchData(){
        let db = Firestore.firestore()
        db.collection("specialities").addSnapshotListener { (querySnapshot, error) in
            guard let documents = querySnapshot else {return }
            self.specialities = documents.documents.compactMap { (doc) -> Spty? in
               let id = doc.documentID
                let spty = doc.get("spty") as? String ?? ""
                let r = doc.get("r") as?  NSNumber ?? 0
                let g = doc.get("g") as?  NSNumber ?? 0
                let b = doc.get("b") as?  NSNumber ?? 0
                
                return Spty(id: id, spty: spty, r: r , g: g , b: b )
            }
        }
    }
}

@StateObject用来引用它并ForEach显示数据。

如果在 Firestore 中,我在集合中创建了一个文档,但没有创建上面列出的字段(spty、r、g、b),我将得到一个黑色矩形(如上面的代码)。

我想要的是:如果没有正确的字段(例如,spty),它将被遗忘(而不是显示黑色矩形,例如:如果我有 4 个正确的文档并且只是添加一个没有正确字段的新文档,我只会得到正确的 4 ,而不是 5 )。

我知道这与as有关?细绳 ??"", 我只是不知道是什么

标签: swiftfirebasegoogle-cloud-firestoreswiftui

解决方案


答案很简单:

          let id = doc.documentID
            if  let spty = doc.get("spty") as? String,
            let r = doc.get("r") as?  NSNumber,
            let g = doc.get("g") as?  NSNumber,
            let b = doc.get("b") as?  NSNumber{
            
            return Spty(id: id, spty: spty, r: r , g: g , b: b )
            }
            else{
                return nil
            }

添加了一个 if 语句


推荐阅读