【发布时间】:2021-03-14 19:47:55
【问题描述】:
给定嵌套对象的数据如下:
struct Store{
var name: String
var items: [Item]
}
struct Item{
var name: String
var free: Bool
}
var dataSet = [
Store(name: "firstStore", items: [
Item(name: "item1", free: false), Item(name: "item2", free: false), Item(name: "item3", free: true),
]),
Store(name: "secStore", items: [
Item(name: "item4", free: true), Item(name: "item5", free: false), Item(name: "item6", free: true),
]),
Store(name: "thiStore", items: [
Item(name: "item7", free: false), Item(name: "item8", free: true), Item(name: "item9", free: false),
]),
Store(name: "lastStore", items: [
Item(name: "item10", free: true), Item(name: "item11", free: false), Item(name: "item12", free: true),
]),
]
通过给定一个部分(商店)和一行(项目)作为起点,我需要找到满足某些条件的下一个/上一个项目(在这种情况下是免费的)。我将使用 IndexPath 来标注位置。这些方法不仅应该返回项目,还应该返回位置(由 IndexPath 表示)。
这就是我得到的。它正在工作,但肯定有更好更干净的存档方式。
func nextFree(from start: IndexPath) -> (Item, IndexPath)?{
for (section, store) in dataSet.enumerated().dropFirst(start.section) {
for (row, item) in store.items.enumerated().filter({$0.element.free}){
if section == start.section && row <= start.row { continue }
return (item, IndexPath(row: row, section: section))
}
}
return nil
}
func previousFree(from start: IndexPath) -> (Item, IndexPath)?{
for (section, store) in dataSet.enumerated().reversed(){
if section > start.section { continue }
for (row, item) in store.items.enumerated().reversed().filter({$0.element.free}){
if section == start.section && row >= start.row { continue }
return (item, IndexPath(row: row, section: section))
}
}
return nil
}
最干净、最高效的方法是什么?
【问题讨论】:
标签: swift algorithm multidimensional-array collections