Поиск по массиву из модели данных в SwiftUI

#ios #arrays #xcode #swiftui #ios14

#iOS #массивы #xcode #swiftui #ios14

Вопрос:

Еще одна сложная проблема SwiftUI, которую я не могу решить!

У меня есть 2 списка в представлении, каждый из которых считывается из структуры модели данных. Когда строка выбрана в первом списке, я обновляю a @State заголовком выбранной строки.

В моем втором списке модель данных имеет массив, который может совпадать или не совпадать с заголовком обновленного @State . Я пытаюсь выполнить поиск по массиву, чтобы узнать, соответствует ли он вновь выбранной @State строке, и представить строку только в том случае, если она совпадает, но я не могу понять, как выполнить поиск по каждому массиву для каждой строки. Как мне получить доступ к массиву, чтобы узнать, совпадает ли он @State ?

Я не включил 2 представления строк ApplicationsListRow , и ProductListRow поскольку это простые HStacks, которые просто берут заголовок из модели данных.

Вот мой взгляд на список 2:

 struct ProductListTabApplications: View {
    
    @State private var selectedOption = "Food"
    
    var applications: [ApplicationModel] = applicationData
    var products: [ProductModel] = productData
    
    var body: some View {
        HStack {
            List(){
                ForEach(applications) { item in
                    Button(action: {
                        self.selectedOption = item.title
                    }) {
                        ApplicationsListRow(application: item)
                    }
                }
            }
            List{
                ForEach(products) { item in
                    NavigationLink(destination: ProductTabView(product: item)) {
                        ProductListRow(product: item)
                    }
                }
            }
        }
    }
}
  

Я пытался использовать циклы for и операторы if во втором списке, но я не могу найти способ получить доступ к массиву, чтобы узнать, существует ли он. Вот один из примеров, которые я пробовал:

 ForEach(products) { item in
     ForEach(item) { application in
         if item.application[application] == selectedOption {
            // list items
          }
      }
 }
  

Упрощенная модель данных:

 struct ProductModel: Identifiable {
var id = UUID()
var title: String
var application: [String]  
}
  

Упрощенная структура:

 let productData: [ProductModel] = [
    ProductModel(
        title: "product1",
        application: ["Food","Metals","Beverage"]
    ),
    ProductModel(
        title: "product2",
        application: ["Beverage"]
    ),
]
  

Ответ №1:

вы можете использовать filter для поиска совпадений в своих списках.

пример:

 let matchedItems = products.filter {
    product in
    let list = product.application
    for item in list {
        if item == selectedOption {
            return true
        }
    }
    return false
}
  

теперь у вас есть все продукты, у которых есть совпадающая строка в их массиве приложений.