簡體   English   中英

如何過濾視圖中顯示的數據?

[英]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對象列表並返回一個新列表,其中僅包含isSeltzertrueFlavor對象。

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

如果您想要相反的情況(即isSeltzerfalse ),您可以簡單地將閉包中的$0.isSeltzer更改為.$0.isSeltzer 另外, 請查看有關filter(_:)方法的文檔。

如果這不能解決您的問題,那么您的代碼還有其他問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM