#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
}
теперь у вас есть все продукты, у которых есть совпадающая строка в их массиве приложений.