Swift 从Firestore获取数据并正确附加到数组

Swift 从Firestore获取数据并正确附加到数组,swift,firebase,google-cloud-firestore,Swift,Firebase,Google Cloud Firestore,我正在尝试从Firestore获取数据。我已经获得了以下代码,但是如何正确地附加到避难所 当前错误: 类型“[String:Any]”的值没有成员“title” 此处的值类型为[字符串:任意]。所以你不能做value.title。你需要做value[“title”]as吗?一串“”和类似的id、图像、距离等 因此,最终代码变成: let shelter = Shelter(id: Int(value["id"], title: value["title"], image: value["imag

我正在尝试从Firestore获取数据。我已经获得了以下代码,但是如何正确地附加到
避难所

当前错误:

类型“[String:Any]”的值没有成员“title”

此处的
类型为
[字符串:任意]
。所以你不能做
value.title
。你需要做
value[“title”]as吗?一串“”
和类似的id、图像、距离等

因此,最终代码变成:

let shelter = Shelter(id: Int(value["id"], title: value["title"], image: value["image"], availableSpaces: value["available"], distance: value["distance"], gender: value["gender"])
相应地贬低它

更新

用这个替换你的代码

if let shelter = Shelter(id: value["id"] as? Int ?? -1, title: value["title"] as? String ?? "", image: value["image"] as? String ?? "", available: value["available"] as? Int ?? -1, distance: value["distance"] as? Double ?? -1, gender: value["gender"] as? String ?? "") { 
   self.shelters.append(shelter)
} else { 
   print("provided data is wrong.")
}

原始代码存在许多问题:

  • 代码中的以下代码片段不是实现获取避难所的函数,而是创建一个计算属性-不确定这是否是您想要的:
  • gethockets(){
    ...
    }
    
    我建议用一个合适的函数来替换它

  • 无需为您的数据模型使用
    ,尤其是在您似乎正在使用SwiftUI的情况下

  • 我建议您使用Firestore的可编码支持,而不是手动映射获取的文档(并且必须自己处理
    nil
    值、类型转换等)

  • 我已经在我的文章中广泛地写过这方面的内容

    下面是应用我的建议时代码的外观:

    struct庇护所:可编码、可识别{
    @DocumentID变量id:String?
    变量标题:字符串
    变量图像:字符串
    var可用空间:Int
    var距离:双
    性别:字符串?
    }
    类FirebaseSession:ObserveObject{
    @已发布的var避难所=[避难所]()
    private var db=Firestore.Firestore()
    私有var listenerRegistration:listenerRegistration?
    脱硝{
    退订
    }
    取消订阅功能(){
    如果listenerRegistration!=无{
    listenerRegistration?.remove()
    listenerRegistration=nil
    }
    }
    func subscribe(){
    如果listenerRegistration==nil{
    listenerRegistration=db.collection(“避难所”).addSnapshotListener{(querySnapshot,错误)在
    guard let documents=querySnapshot?.其他文档{
    打印(“无文件”)
    返回
    }
    self.hedders=documents.compactMap{queryDocumentSnapshot in
    try?queryDocumentSnapshot.data(as:shedder.self)
    }
    }
    }
    }
    }
    
    请注意:

  • 我们可以取消
    避难所的构造函数
  • 现在,只要在Firestore中将避难所添加到
    避难所
    集合中,避难所属性就会自动更新
  • 如果文档与预期的数据结构不匹配,则代码不会中断

  • 我将
    避难所
    结构标记为可识别,以便您可以在
    列表
    视图中直接使用它。
    @DocumentID
    指示Firestore将文档ID映射到结构上的相应属性。

    我现在不知何故得到以下附加错误:
    无法将“避难所”类型的值转换为预期值rgument类型“[避难所]“
    。你可以在编辑中找到我新的
    让避难所=…
    代码。@蒂姆我已经更新了代码。还有,哪一行产生了上面的错误?因为这不应该发生。使用你更新的代码没有问题,我只需要打开
    避难所?
    避难所
    使用
    避难所!
    -我希望没问题?@Tim我有你使用if-let语句更新答案以安全地打开避难所对象。最好使用此语句,因为如果避难所初始化失败,它不会使应用程序崩溃。
    let shelter = Shelter(id: value["id"] as? Int ?? -1, title: value["title"] as? String ?? "", image: value["image"] as? String ?? "", available: value["available"] as? Int ?? -1, distance: value["distance"] as? Double ?? -1, gender: value["gender"] as? String ?? "")
    
    let shelter = Shelter(id: Int(value.id), title: value.title, image: value.image, availableSpaces: value.available, distance: value.distance, gender: value.gender)
    
    let shelter = Shelter(id: Int(value["id"], title: value["title"], image: value["image"], availableSpaces: value["available"], distance: value["distance"], gender: value["gender"])
    
    if let shelter = Shelter(id: value["id"] as? Int ?? -1, title: value["title"] as? String ?? "", image: value["image"] as? String ?? "", available: value["available"] as? Int ?? -1, distance: value["distance"] as? Double ?? -1, gender: value["gender"] as? String ?? "") { 
       self.shelters.append(shelter)
    } else { 
       print("provided data is wrong.")
    }