【发布时间】:2020-01-16 03:12:59
【问题描述】:
我是 Swift 和 SwiftUI 的新手。
我有一个 RecipeLinkFetcher() 动态获取一个 json 文件并填充一组配方对象。 我正在尝试根据类别过滤 RecipeLink 对象的数组。
RecipeLink 定义为
struct RecipeLink: Codable, Identifiable
{
public var id: Int
public var category: String
public var title: String
public var permalink: String
public var excerpt: String
public var image: String
enum CodingKeys: String, CodingKey {
case id = "id"
case category = "category"
case title = "title"
case permalink = "permalink"
case excerpt = "excerpt"
case image = "featured_image"
}
}
在我看来,我正在使用下面的代码来填充包含 RecipeLink 数组的变量 fetcher
@ObservedObject var fetcher = RecipeLinkFetcher()
var categoryName: String = "Featured"
我正在尝试使用下面的方法将其过滤为一个新变量,但这不起作用
var recipes = fetcher.filter($0.category == categoryName)
这是我的 RecipeLinkFetcher
import Foundation
public class RecipeLinkFetcher: ObservableObject {
@Published var recipeLink:[RecipeLink] = [RecipeLink]()
init(){
load()
}
func load() {
let url = URL(string: "http://localhost/wordpress2/wp-content/uploads/json-export.json")!
URLSession.shared.dataTask(with: url) {(data,response,error) in
do {
if let d = data {
let decodedLists = try JSONDecoder().decode([RecipeLink].self, from: d)
DispatchQueue.main.async {
self.recipeLink = decodedLists
}
}else {
print("No Data")
}
} catch {
print ("Error")
}
}.resume()
}
}
struct RecipeLink: Codable, Identifiable {
public var id: Int
public var category: String
public var title: String
public var permalink: String
public var excerpt: String
public var image: String
enum CodingKeys: String, CodingKey {
case id = "id"
case category = "category"
case title = "title"
case permalink = "permalink"
case excerpt = "excerpt"
case image = "featured_image"
}
}
这是我的 UIView,标有 ** 的行我试图过滤数组/列表
struct CategoryRow: View {
@ObservedObject var fetcher = RecipeLinkFetcher()
var categoryName: String
**var filteredList = $fetcher.filter({$0.category==categoryName})**
var body: some View {
VStack() {
Text(self.categoryName.htmlUnescape())
.font(.headline)
.padding(.leading, 15)
.padding(.top, 5)
// ScrollView(.horizontal, showsIndicators: false) {
List(fetcher.recipeLink){ recipe in
if(recipe.category.htmlUnescape() == self.categoryName){
HStack(alignment: .top, spacing: 0 ){
CategoryItem(imageURL: recipe.image, recipeTitle: recipe.title)
}
}
}
}
}
}
【问题讨论】:
-
试试
var recipes = fetcher.filter { $0.category == categoryName }
标签: arrays swift object filter swiftui