根据Bool值和TimeStamp对数组进行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

如何按isUnreadtimeStamp对这些消息进行排序?

Bool不符合Comparable。您需要的是扩展Bool类型,将其值转换为符合Comparable的类型,如整数01,并使用其值进行排序:


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

Swift算法stablePartition(by:):的另一种使用方法

import Algorithms
var messages = dataStore.messages
messages.sort { $0.timeStamp > $1.timeStamp }
let firstReadIndex = messages.stablePartition { !$0.isUnread }

另一种可能更直观但使用多次的方法

print(messages.filter(.isUnread).sorted { $0.timeStamp > $1.timeStamp } + messages.filter { !$0.isUnread })

最新更新