ios - 按 Bool 值和时间戳对数组进行 Swift 排序
问题描述
我有一组消息,我想根据它们是否未读以及它们的时间戳来排序。这些消息将显示在 TableView 中。
所有未读消息应显示在顶部,然后按其时间戳排序。
以下是我现在所拥有的;但似乎正在发生的是,这些项目仅按时间戳显示,而不是按顶部的未读和之后的未读消息对它们进行排序。
let channelsSortedByUnreadFirst = dataStore.messages.sorted { $0.isUnread == true && $1.isUnread == false }
let timeSortedItems = channelsSortedByUnreadFirst.sorted(by: { $0.timeStamp > $1.timeStamp })
messagesTableViewSection.items = timeSortedItems
如何按isUnread
和对这些消息进行排序timeStamp
?
解决方案
Bool
不符合Comparable
。您需要扩展Bool
类型并将其值转换为符合Comparable
整数的类型,0
或者1
使用其值对其进行排序:
extension Bool {
var value: Int { self ? 1 : 0 }
}
true.value // 1
false.value // 0
现在您可以在对集合进行排序时使用布尔值:
let channelsSorted = dataStore.messages.sorted { ($0.isUnread.value, $0.timeStamp) > ($1.isUnread.value, $1.timeStamp) }
推荐阅读
- excel - 从 10 个文本框中输入数据,但不要将空文本框值提交到单元格中(使用 excel vba 用户表单)
- php - MySql或php中varchar长度超过150时如何做断线
- python - 如何在列表中找到某些元素列表中最常见的位置?
- java - 在加载数据之前指定要添加到数据库的日期
- javascript - 在 GULP 系列的上一个任务中复制后找不到文件
- python - When given the choice of a method, should the user set it when instantiating or later on?
- javascript - 如何使用 React Hooks 实现类似渲染道具的功能?
- reactjs - 在 lerna reactjs repo 中运行 jest 时出现 babel 问题
- python - 如何使用 Selenium Python 3.x 在私有模式下打开 Microsoft Edge (Chromium)?
- amazon-web-services - 从 S3 存储桶恢复 RDS 的 IAM 策略不起作用