如何在Swift中按未来时间对对象进行排序?

如何在Swift中按未来时间对对象进行排序?,swift,sorting,datetime,Swift,Sorting,Datetime,我有一个带有time属性的对象数组,我想用一种特殊的方式对其进行排序。我想对它们进行排序,以便首先对具有未来时间的对象进行排序,然后对其后面的时间进行排序,然后循环回到过去的项目。以下是我目前掌握的情况: struct MyStruct { var name: String = "" var time: Double = Double(0) } var currentTime = NSDate().timeIntervalSince1970 var myArr: [MyStru

我有一个带有
time
属性的对象数组,我想用一种特殊的方式对其进行排序。我想对它们进行排序,以便首先对具有未来时间的对象进行排序,然后对其后面的时间进行排序,然后循环回到过去的项目。以下是我目前掌握的情况:

struct MyStruct {
    var name: String = ""
    var time: Double = Double(0)
}

var currentTime = NSDate().timeIntervalSince1970
var myArr: [MyStruct] = []
myArr.append(MyStruct(name: "Abc", time: currentTime - 3)) // Past
myArr.append(MyStruct(name: "Def", time: currentTime - 5)) // Past
myArr.append(MyStruct(name: "Ghi", time: currentTime - 1)) // Past
myArr.append(MyStruct(name: "Jkl", time: currentTime + 3)) // Future
myArr.append(MyStruct(name: "Mno", time: currentTime + 2)) // Future

var mySorted = myArr.sorted { $0.time < $1.time }

mySorted // Outputs structs in this order: Def, Abc, Ghi, Mno, Jkl
struct MyStruct{
变量名称:String=“”
变量时间:双=双(0)
}
var currentTime=NSDate().时间间隔1970
var myArr:[MyStruct]=[]
myArr.append(MyStruct(名称:“Abc”,时间:currentTime-3))//过去
追加(MyStruct(名称:“Def”,时间:currentTime-5))//过去
追加(MyStruct(名称:“Ghi”,时间:currentTime-1))//过去
myArr.append(MyStruct(名称:“Jkl”,时间:currentTime+3))//未来
myArr.append(MyStruct(名称:“Mno”,时间:currentTime+2))//未来
var mySorted=myArr.sorted{$0.time<$1.time}
mySorted//按以下顺序输出结构:Def、Abc、Ghi、Mno、Jkl

我不知道在sort谓词中首先按最近的未来时间进行排序要做什么。换句话说,我想展示下一个基于当前时间的对象。因此,上述内容应分类为:
Mno、Jkl、Ghi、Abc、Def
。我一直在绞尽脑汁想这个问题,希望有人能找到解决这个问题的算法?

应该没那么难。。。如果两者都在过去,都在未来,或者双方各有一个,那么比较就不同了

此代码应适用于:

var mySorted = myArr.sorted { (a: MyStruct, b: MyStruct) in
    var c = currentTime
    if a.time > c && b.time > c {
        // both in the future
        return a.time < b.time
    }
    else if a.time < c && b.time < c {
        // both in the past
        return a.time > b.time
    }
    else if a.time > c {
        return true
    }
    return false
}
var mySorted=myArr.sorted{(a:MyStruct,b:MyStruct)在
var c=当前时间
如果a.time>c&&b.time>c{
//未来两者
返回a.timeb.time
}
否则,如果a.time>c{
返回真值
}
返回错误
}

如果您想使用更实用的样式,可以使用

let mySorted2 = 
    myArr.filter{ $0.time > currentTime }.sorted{ $0.time < $1.time } +
    myArr.filter{ $0.time <= currentTime }.sorted{ $0.time > $1.time }
让mySorted2=
myArr.filter{$0.time>currentTime}.sorted{$0.time<$1.time}+
myArr.filter{$0.time$1.time}

我认为这段代码更具可读性,因为它更符合您的需求。获取所有未来日期并按升序排序,然后追加所有按降序排序的过去日期

你只是方向不对。将其更改为>啊,你是对的,但我仍然认为我需要弹出最近的未来项目,并将其重新插入顶部。谢谢!您可以使用filter()将它们分成两个数组,一个是过去的arr,一个是将来的arr,然后对它们进行排序并将它们放在一起。