如果文档存在,则在 foreach 循环中设置布尔值

Posted

技术标签:

【中文标题】如果文档存在,则在 foreach 循环中设置布尔值【英文标题】:Set boolean in foreach loop if document exists 【发布时间】:2021-01-13 21:08:25 【问题描述】:

我一直在努力解决这个问题,希望有人可以帮助我或为我指明正确的方向。 (如果这是一个愚蠢的问题,我是 swift 的新手,所以很抱歉)。

我在下面发生的是一个 foreeach 循环,如果项目来自 db。在每个项目上,它都会引用数据库中的一个单独文档,以查看该特定用户是否存在该文档。 checkUserAddedItems 中的 print 完美运行,显示每个项目以及该用户是否存在它们。我正在努力解决如果文档存在,如何将items[i].selected 设置为 true,以便它将显示删除按钮而不是该特定项目的添加

非常感谢任何帮助!

@State var items = [ItemsModel]()

var body: some View 
VStack
ForEach(items.indices, id: \.self)  i in
   HStack 
   Text(items[i].name)
   
   if items[i].selected == false 
      Button(action:  addItem() )  Text("Add") 
    else  
      Button(action:  removeItem() )  text("Remove") 
   
   
   .onAppear  checkUserAddedItems(itemName: items[i].name)

.onAppear  fetchItems() 



func checkUserAddedItems(itemName: String) 
        
   let db = Firestore.firestore()
   let docRef = db.collection("users").document("\(userInfo.user.uid)").collection("itemAdded").document(self.movieID).collection("item").document("\(itemName)")
        
   docRef.getDocument  (document, error) in
      if let document = document, document.exists 
         print("\(itemName) exists")
       else 
         print("\(itemName) does not exist")
      
   


func fetchItems() 
   let db = Firestore.firestore()
   db.collection("movies").document("\(self.movieID)").collection("items").getDocuments  (NewQuerySnapshot, error) in
   guard let documents = NewQuerySnapshot?.documents else 
      print("No Documents")
      return
   
   items = documents.map  (NewQueryDocumentSnapshot) -> ItemsModel in
                
      let data = NewQueryDocumentSnapshot.data()
      let name = data["name"] as? String ?? ""
                
      return ItemsModel(name: name)
                
   
   
   


struct ItemsModel: Identifiable 
    var id: String = UUID().uuidString
    var name: String
    var selected:Bool = false

【问题讨论】:

【参考方案1】:

您需要使用已在正确项目上设置值的更新后的项目数组来重置您的状态变量。一种解决方案是在数组上执行map 并且只修改一个值。

类似:

func setSelectedOnItem(id: String, val: Boolean) 
  items = items.map  item in 
    if item.id == id 
      var newItem = item
      newItem.selected = val
      return newItem
     else 
      return item
    
  

然后,在您的checkUserAddedItems 函数中,调用上述方法,从文档中填写id。您大概只需要在它存在时调用它 - 否则它将保持错误。

【讨论】:

以上是关于如果文档存在,则在 foreach 循环中设置布尔值的主要内容,如果未能解决你的问题,请参考以下文章

前端进阶知识

Spring Boot:如果不存在,则在启动时在 mongodb 中创建文档

如果存在,则在 mongodb 中增加嵌套字段值或创建嵌套字段

如果存在,则在 mongodb 中增加嵌套字段值或创建嵌套字段

如何在 foreach 循环中删除数组元素?

php中foreach循环遍历二维数组