根据元组的第二个值对数组进行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值会在哪里结束(它们会在开始的时候)。