Swift 加载单元格前过滤内容

Swift 加载单元格前过滤内容,swift,filter,protocols,Swift,Filter,Protocols,我得到了在加载单元格之前需要过滤的数据模型。该系统具有以下结构: struct Food: Decodable { let title: String? let content: [Category]? } struct Category: Decodable { let title: String? let items: [FoodItem]? } struct FoodItem: Decodable { let title: String? let image: URL?

我得到了在加载单元格之前需要过滤的数据模型。该系统具有以下结构:

struct Food: Decodable {
 let title: String?
 let content: [Category]?
}

struct Category: Decodable {
 let title: String?
 let items: [FoodItem]?
}

struct FoodItem: Decodable {
 let title: String?
 let image: URL?
 let summary: String?
}
我将它们加载到
UICollectionView
上。我只想要有
标题
图像
摘要
的内容。我可以用项目筛选类别。如何在整个
食品
数据模型中传播。从技术上讲,我可以
进行
循环。我想知道我可以为每个模型添加一个通用协议/函数来实现相同的功能

使用

var filteredItem: Bool {
   return title != nil && summary != nil && image != nil
}

基本上,你想要的是方法,你可以这样使用:

我认为你有一个数组<代码>食物< /代码>,所以你想过滤它,因为每个食物的<代码>内容<代码>(<代码> [类别] < /代码>)必须包含<代码>项目(<代码> [食物项目] < /代码>),具有非零属性:

// arr: [Food]
let filteredFood = arr.filter { food -> Bool in
    var bool = false
    food.content?.forEach { $0.items?.forEach({ foodItem in
        bool = foodItem.title != nil && foodItem.summary != nil && foodItem.image != nil
    })}
    return bool
}

不清楚问题是什么。你想从所有类别中获取一个食品数据项的平面列表吗?我正在为
Food
中的内容获取一个2D数组,该数组中的项目具有标题、图像和摘要,但不具有空值。过滤掉FoodItems只是部分相关,但为什么所有内容都是可选的?实际上有没有没有没有标题和内容的食物?数组应该是空的,但不是可选的。唯一可以选择的属性是
图像
和可能的
摘要
。我同意,但swiftlint希望decodables是可选的。服务器可能无法返回正确的数据。SwiftLint是一个不必要的挑剔者。如果服务器更改了数据格式,您将得到一个错误,这实际上会导致与不显示任何内容相同的用户体验。