按天创建具有分组/截面的2D阵列

时间:2020-05-11 12:17:47

标签: arrays swift

我有一个简单的,未分类的项目数组,包括Date

struct Item {
    let itemCategory:ItemCategory
    var createDate:Date
    let id:UUID = UUID()
}

let allItems:[Item] = [
    Item(itemCategory:.sweets, date:Date().daysFromNow(days: -3)),
    Item(itemCategory:.meal, date:Date().daysFromNow(days: -1)),
    Item(itemCategory:.sweets, date:Date().daysFromNow(days: -4)),
    Item(itemCategory:.meal, date:Date().daysFromNow(days: -1)),
    Item(itemCategory:.drink, date:Date()),
    Item(itemCategory:.sweets, date:Date().daysFromNow(days: -5)),]

我想创建一个按日期排序的版本,并使用第二个维度按天对项目进行分组。我想将此2D数组用作UITableView的数据源。第一维应告知各部分,第二维应包含项目。

list = [[Item]]

示例层次结构

Today
⌙ ...
⌙ ...
Yesterday
⌙ ...
May 3
⌙ ...
April 3
⌙ ...

创建这个新数组的好方法是什么?

1 个答案:

答案 0 :(得分:0)

正如其他人提到的那样,建议的[[Item]]数组并不适合您的需求,因为您以后将不知道应该为每行项目映射的日期(除非您分别记录日期)。

然后,仅将字典分组是不够的,因为按日期的字典(尽管部分解决了请求)没有按您的请求(IMO)的要求对键进行排序。我建议使用简单的元组数组作为输出类型:[(date:Date,item:[Item])]

最后一个警告是,如果多次调用Date(),它将返回不同的日期值,因为日期也随一天的时间而变化,并且一天的时间显然在语句执行之间发生变化(计算机不是无限快的)。 / p>

我将以上所有内容固定在small gist中,这是返回所需元组的代码,其中的项已分组,而组则按降序排序:

let sortedDates = Set(allItems.map { item in item.date }).sorted { date1, date2 in date1>date2 }
let datesWithItems = sortedDates.map { date in (date: date, items: allItems.filter { item in item.date == date }) }

更新:您可以改用Dictionary来收集日期和项目,但是如果您不喜欢sortedDates,则可以调用sorted()返回以键(即日期)降序排列的元组数组。设置方法:

let datesWithItems = Dictionary(grouping: allItems) { item in item.date }
    .sorted { entry1, entry2 in entry1.key > entry2.key }

然后,打印dateWithItems的内容将具有以下形式(对于具有相同Date()值的模拟数据):

2020-05-11 13:20:41 +0000
     drink
2020-05-10 13:20:41 +0000
     meal
     meal
2020-05-08 13:20:41 +0000
     sweets
2020-05-07 13:20:41 +0000
     sweets
2020-05-06 13:20:41 +0000
     sweets
相关问题