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

感谢您阅读我的文章。

我有一个元组的数组声明如下:

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

在我的循环结束时,我想基于每个元组的item2,其types是NSDate?sorting我的元组数组NSDate?

基于这个答案和这个答案,我尝试了以下,但收到这个编译器错误, "cannot invoke 'sort' with an argument list of type '((_,_) -> _)'

这是我试过的:

 myArray.sort {$0.1.item2?.compare($1.1.item2?) == NSComparisonResult.OrderedDescending } 

PS println()工作正常,打印item1和item2作为可选。

您必须实现对NSDate的可比较协议

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

之后,你可以按datesorting你的元组:

 myArray!.sort {$0.1 == $1.1 ? $0.1 > $1.1 : $0.1 > $1.1 } 

可接受的解决scheme的替代scheme:

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

链接的解决scheme不工作的原因是因为在问题中定义的元组数组包含可选的types。

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

一个例子,有3个date和可选的types:

 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 } 

相同的代码,如果types不允许可选项:

 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的解决scheme也运行良好,但是你无法控制nil值会在哪里结束(它们会在开始的时候)。