[英]How do I filter my data displayed in my view?
我的 XCODE Swift 下面的 VIEW 代碼顯示了我數據中所有風味組和描述符的列表。 我想做的是過濾數據以顯示所有風味組和描述符,除非 isSeltzer 為假。
我嘗試在我的視圖 Model 中使用類似的東西,然后在我的視圖中使用過濾后的數組進行迭代,但我無法讓它工作:
let flavorsNoSeltzers = flavors.filter({ return $0.isSeltzer != false })
這是我本地 JSON 數據的示例:
[
{
"id": "562811",
"flavorGroup": "APRICOT",
"name": "NATURAL AND ARTIFICIAL APRICOT FLAVOR",
"isBeer": true,
"isSeltzer": false,
"isArtificial": true,
"descriptors": ["FRUITY"],
"keywords": ["juicy", "skunky", "peach", "floral", "slight green (sierra nevada pale ale)"]
},
{
"id": "U39252",
"flavorGroup": "BANANA",
"name": "NATURAL BANANA FLAVORING",
"isBeer": true,
"isSeltzer": true,
"isArtificial": false,
"descriptors": [""],
"keywords": ["missing"]
},
{
"id": "681686",
"flavorGroup": "WHITE CHOCOLATE",
"name": "NATURAL WHITE CHOCOLATE FLAVOR WONF",
"isBeer": true,
"isSeltzer": true,
"isArtificial": false,
"descriptors": ["LACTONIC", "COCOA", "CREAMY"],
"keywords": ["nutty", "milk chocolate", "french vanilla", "custard", "cakey"]
}
]
這是我的 MODEL 的示例:
struct Flavor: Codable, Identifiable {
enum CodingKeys: CodingKey {
case id
case flavorGroup
case name
case isBeer
case isSeltzer
case isArtificial
case descriptors
case keywords
}
let id, flavorGroup, name: String
let isBeer, isSeltzer, isArtificial: Bool
let descriptors, keywords: [String]
}
這是我的 VIEW MODEL 的示例:
class ReadData: ObservableObject {
@Published var flavors = [Flavor]()
init(){
loadData()
}
func loadData() {
guard let url = Bundle.main.url(forResource: "flavors", withExtension: "json")
else {
print("Json file not found")
return
}
let data = try? Data(contentsOf: url)
let flavors = try? JSONDecoder().decode([Flavor].self, from: data!)
self.flavors = flavors!
}
}
這是我的觀點的一個例子:
struct myView: View {
@ObservedObject var flavorData = ReadData()
var body: some View{
List(flavorData.flavors){ flavor in
VStack(alignment: .leading) {
Text(flavor.flavorGroup)
ForEach(flavor.descriptors, id: \.self) { descriptor in
if descriptor.isEmpty {
// do nothing
} else {
Text("- \(descriptor)")
}
}
}
}
}
}
一個簡化的工作示例,過濾Flavor
對象列表並返回一個新列表,其中僅包含isSeltzer
為true
的Flavor
對象。
import Foundation
struct Flavor {
let id: String
let isSeltzer: Bool
}
let flavors = [Flavor(id: "First", isSeltzer: false), Flavor(id: "Second", isSeltzer: true), Flavor(id: "Third", isSeltzer: false)]
let flavorsSeltzersTrue = flavors.filter({ $0.isSeltzer })
print(flavorsSeltzersTrue) // Prints the flavors with isSeltzer == true
如果您想要相反的情況(即isSeltzer
為false
),您可以簡單地將閉包中的$0.isSeltzer
更改為.$0.isSeltzer
。 另外, 請查看有關filter(_:)
方法的文檔。
如果這不能解決您的問題,那么您的代碼還有其他問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.