我有一组消息,我想根据它们是否未读以及它们的时间戳对它们进行排序。这些消息将显示在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) }
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 })