SwiftUI、Firestore获取一个集合并与另一个集合匹配

SwiftUI、Firestore获取一个集合并与另一个集合匹配,swift,firebase,google-cloud-firestore,swiftui,Swift,Firebase,Google Cloud Firestore,Swiftui,我对将一个收藏链接到另一个收藏感到困惑,任何反馈都将不胜感激。 我必须将集合编码为结构: struct KetoTarif: Hashable, Codable, Identifiable { var id: Int var name: String } struct Keto: Hashable, Codable, Identifiable { var id: Int var breakfast: String //this should mat

我对将一个收藏链接到另一个收藏感到困惑,任何反馈都将不胜感激。 我必须将集合编码为结构:

struct KetoTarif:  Hashable, Codable, Identifiable {
    var id: Int
    var name: String
}

struct Keto:  Hashable, Codable, Identifiable {
    
    var id: Int
    var breakfast: String //this should match with name in KetoTarif
}
我获取Keto的数据如下:

class KetoViewModel:  ObservableObject, Identifiable {
    
    @Published var ketoDays = [Keto]()
    func fetchData() {
        
        db.collection("keto").addSnapshotListener { (querySnapshot, error) in
            guard let documents = querySnapshot?.documents else {
                print("No documents")
                return
            }
            self.ketoDays = documents.compactMap { document in
                do {
                    let x = try document.data(as: Keto.self)
                    return x
                } catch {
                    print(error)
                }
                return nil
            }
        }
    }
}
同样地,我也为我的第二个系列做同样的事情

class KetoTarifViewModel:  ObservableObject, Identifiable {
    
    @Published var ketoTarifler = [KetoTarif]()
    func fetchData() {
        
        db.collection("ketotarifler").addSnapshotListener { (querySnapshot, error) in
            guard let documents = querySnapshot?.documents else {
                print("No documents")
                return
            }
            self.ketoTarifler = documents.compactMap { document in
                do {
                    let x = try document.data(as: KetoTarif.self)
                    return x
                } catch {
                    print(error)
                }
                return nil
            }
        }
    }
}
最后,我的观点我添加了我的主要目的作为评论:

struct KetoDiyet: View {
    @ObservedObject var ketoModel = KetoViewModel()
    @ObservedObject var ketoTarifModel = KetoTarifViewModel()
    var body: some View {
        ScrollView {
            
            Text("c")
            
            ForEach(ketoModel.ketoDays) { keto in
                //here keto.breakfast returns a string
                // and I want to search/find/print that string in ketoTarifModel
                
            }
            
            }.onAppear() {
                self.ketoModel.fetchData()
                self.ketoTarifModel.fetchData()
             
                
            }
    }
}
主要思想是Keto有一个字符串(早餐),该字符串应该与Keotarif中的名称匹配。 我刚从关系数据库切换过来,有一个问题把我的注意力放在了这个问题上


谢谢

首先,谢谢你提出的好问题。提供所有代码,问题明确。喜欢它

然后,有两种可能性,这取决于用例。有多个匹配项还是只有一个匹配项?无论如何下面的代码应该可以,并且正在Xcode版本12.4(12D4e)中编译:


注意:For-in-For-loop对于大型数据集来说可能是一个难题。我走的方向非常错误。非常感谢你的回答!
struct ContentView: View {
    @ObservedObject var ketoModel = KetoViewModel()
    @ObservedObject var ketoTarifModel = KetoTarifViewModel()
    var body: some View {
        ScrollView {
            
            Text("c")
            
            ForEach(ketoModel.ketoDays) { keto in
                
                // get the first element that satisfies your needs
                if let firstKetoTarifModel = ketoTarifModel.ketoTarifler.first(where: {$0.name == keto.breakfast}) {
                    Text(firstKetoTarifModel.name)
                }
                
                // get multiple elements
                ForEach(ketoTarifModel.ketoTarifler) { ketoTarifler in
                    if ketoTarifler.name == keto.breakfast {
                        Text(ketoTarifler.name)
                    }
                }
                
                //here keto.breakfast returns a string
                // and I want to search/find/print that string in ketoTarifModel
                
            }
            
            }.onAppear() {
                self.ketoModel.fetchData()
                self.ketoTarifModel.fetchData()
            }
    }
}