根据元组

时间:2015-09-15 19:49:35

标签: ios arrays swift sorting nsdate

感谢阅读我的帖子。

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

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

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

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

以下是我的尝试:

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

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

3 个答案:

答案 0 :(得分:1)

您必须为NSDate

实施Comparable协议
myArray!.sort {$0.1 == $1.1 ? $0.1 > $1.1 : $0.1 > $1.1 }

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

class Foo
{
public:
    Foo() : Foo(Singleton::getC1()) {}

private:

    explicit Foo(Class1& c1) : Foo(c1, c1.getC2()) {}
    Foo(Class1& c1, Class2& c2) : Foo(c1, c2, c2.getC3()) {}
    Foo(Class1& c1, Class2& c2, Class3& c3) : m_number(10), m_foo(c3)
    {
        // other stuff with C1, c2, c3
    }
    // ...
};

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

检查选项可以解决问题,而无需向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的解决方案也运行良好,但您无法控制零值的结束位置(它们将在开头)。