首页 > 解决方案 > 按 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

标签: iosarraysswiftsorting

解决方案


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) }

推荐阅读