У меня есть массив сообщений, которые я хочу отсортировать по тому, являются они непрочитанными или нет, и их отметкой времени. Эти сообщения будут отображаться в 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?

1
narner 12 Май 2021 в 03:50

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) }
0
Leo Dabus 12 Май 2021 в 00:55

Другой способ - использование Swift Algorithms stablePartition(by:):

import Algorithms

var messages = dataStore.messages
messages.sort { $0.timeStamp > $1.timeStamp }
let firstReadIndex = messages.stablePartition { !$0.isUnread }
0
AnderCover 12 Май 2021 в 01:31