Sorting 对日期数组进行排序,但若过去的日期下降到数组的底部

Sorting 对日期数组进行排序,但若过去的日期下降到数组的底部,sorting,date,swift3,nsarray,Sorting,Date,Swift3,Nsarray,我需要为即将到来的活动按时间和日期排序一张表。 我需要顶部最近的未来日期字符串,按以下事件递减。但是我想把过去的事件放到数组/表的底部,在那里我会隐藏日期和时间,这样历史就会显示出来 如果有区别的话,它是一个结构数组 例如: 事件3-14:15 事件4-15:00 事件5-18:03 事件1- 事件2- 下面是我的数组排序,我只想把过去的日期放到底部 newArray = oldArray.sorted(by: {Date(timeIntervalSinceNow: $0.eventTime &

我需要为即将到来的活动按时间和日期排序一张表。 我需要顶部最近的未来日期字符串,按以下事件递减。但是我想把过去的事件放到数组/表的底部,在那里我会隐藏日期和时间,这样历史就会显示出来

如果有区别的话,它是一个结构数组

例如:

事件3-14:15

事件4-15:00

事件5-18:03

事件1-

事件2-

下面是我的数组排序,我只想把过去的日期放到底部

newArray = oldArray.sorted(by: {Date(timeIntervalSinceNow: $0.eventTime < Date(timeIntervalSinceNow: $1.eventTime})

作为一个临时补丁,我已经这样做了,我相信有一个更优雅的方式来做,但它可能会帮助别人,直到更好的解决方案出现

        let allStartToFin = myArrat.sorted(by: {Date(timeIntervalSinceNow:($0.startTime)!).timeIntervalSinceNow < Date(timeIntervalSinceNow:($1.startTime)!).timeIntervalSinceNow})

        var correctOrder = [Object]()
        var past = [Object]()
        for item in 0...(allStartToFin.count - 1) {
            if (Date(timeIntervalSince1970: TimeInterval((allStartToFin[item].startTime)!))) > Date() {
                correctOrder.append(allStartToFin[item])
            } else {
               past.append(allStartToFin[item])
            }
            if item == (allStartToFin.count - 1) {
                correctOrder = correctOrder + past
                self.finalArray = correctOrder
                self.tableView.reloadData()
            }
        }

解决方案A:排序、拆分和合并

let now = Date()
let sortedArray = myArray.sorted(by: { $0.startTime < $1.startTime })
var finalArray = sortedArray
if let index = sortedArray.index(where: { $0.startTime > now }) {
    if index > 0 {
        finalArray = Array(sortedArray[index ..< sortedArray.endIndex] + sortedArray[sortedArray.startIndex ... index - 1])
    }
}
解决方案B更快:按谓词排序

let now = Date()
let newArray = myArray.sorted(by: {
    if $0.startTime > now {
        if $1.startTime > now {
            return $0.startTime < $1.startTime
        } else {
            return true
        }
    } else {
        if $1.startTime > now {
            return false
        } else {
            return $0.startTime < $1.startTime
        }
    }
})

作为一个丑陋的临时补丁,我已经这样做了,我相信有一个更优雅的方式,虽然这样做