Swift 从Firestore获取数据并正确附加到数组
我正在尝试从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
避难所
当前错误:
类型“[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的情况下
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)
}
}
}
}
}
请注意:
避难所的构造函数
避难所
集合中,避难所属性就会自动更新我将
避难所
结构标记为可识别,以便您可以在列表
视图中直接使用它。@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.")
}