У меня есть массив сообщений, которые я хочу отсортировать по тому, являются они непрочитанными или нет, и их отметкой времени. Эти сообщения будут отображаться в 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
?
2 ответа
Bool не соответствует Comparable
. Вам нужно расширить тип Bool
и преобразовать его значение в тип, соответствующий Comparable
, например integer 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 Algorithms stablePartition(by:)
:
import Algorithms
var messages = dataStore.messages
messages.sort { $0.timeStamp > $1.timeStamp }
let firstReadIndex = messages.stablePartition { !$0.isUnread }
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.