【问题标题】:Swift sort array by Bool value and TimeStamp按 Bool 值和时间戳对数组进行 Swift 排序
【发布时间】:2021-08-02 08:48:20
【问题描述】:

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

【问题讨论】:

    标签: ios arrays swift sorting


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    使用Swift AlgorithmsstablePartition(by:)的另一种方式:

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

    【讨论】:

      【解决方案3】:

      另一种可能更直观但使用多次传递的方式。

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

      【讨论】:

      • 我认为阅读的消息也应该排序
      • "所有未读邮件应显示在顶部,然后按其时间戳排序。"它是一种模棱两可的语言。嗯
      • 我同意,如果 OP 觉得需要,添加起来很容易:)
      猜你喜欢
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多