根据元组的第二个值对数组进行排序

Sort an array based on the second value of a tuple

感谢阅读我的 post。

我有一个这样声明的元组数组:

var myArray: [(item1: String?, item2: NSDate?)] = []

在我的循环结束时,我想根据每个元组的 item2 对我的元组数组进行排序,其类型为 NSDate?.

基于此 answer and this answer 我尝试了以下操作,但收到此编译器错误,"cannot invoke 'sort' with an argument list of type '((_,_) -> _)'

这是我尝试过的:

myArray.sort {[=10=].1.item2?.compare(.1.item2?) == NSComparisonResult.OrderedDescending }

P.S。 println() 工作正常并将 item1 和 item2 作为可选打印。

您必须为 NSDate 实现 Comparable 协议

public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs === rhs || lhs.compare(rhs) == .OrderedSame
}

public func <(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.compare(rhs) == .OrderedAscending
}

extension NSDate: Comparable { }

之后您可以按日期对元组进行排序:

myArray!.sort {[=11=].1 == .1 ? [=11=].1 > .1 : [=11=].1 > .1 }

已接受解决方案的替代方案:

let res = myArray.sort { (left, right) -> Bool in
    return left.item2?.timeIntervalSinceReferenceDate < right.item2?.timeIntervalSinceReferenceDate
}

链接解决方案不起作用的原因是问题中定义的元组数组包含可选类型。

检查选项可以解决问题,而无需向 NSDate 添加新的运算符。

一个示例,包含 3 个日期和可选类型:

var myArray: [(item1: String?, item2: NSDate?)] = []
myArray = [("now", NSDate()), ("now+30s", NSDate().dateByAddingTimeInterval(NSTimeInterval(30))), ("now-30s", NSDate().dateByAddingTimeInterval(NSTimeInterval(-30)))]

myArray.sortInPlace { (lhs, rhs) -> Bool in
    if lhs.item2 != nil && rhs.item2 != nil {
        return lhs.item2!.compare(rhs.item2!) == .OrderedAscending
    }
    return false // Return true if you want nil values first
}

相同的代码,如果类型不允许可选:

var myArray: [(item1: String, item2: NSDate)] = []
myArray = [("now", NSDate()), ("now+30s", NSDate().dateByAddingTimeInterval(NSTimeInterval(30))), ("now-30s", NSDate().dateByAddingTimeInterval(NSTimeInterval(-30)))]

myArray.sortInPlace { (lhs, rhs) -> Bool in
    return lhs.item2.compare(rhs.item2) == .OrderedAscending
}

MirekE 的解决方案也很有效,但您无法控制 nil 值的结束位置(它们将在开头)。