如何在Swift中结合两种排序方法?

时间:2017-03-17 10:24:50

标签: sorting swift3

这是我在使用Swift 3时遇到的排序问题。我有一个包含许多对象的数组,如下所示。 排序方法应包括两个步骤: - 具有相同条形码的对象将并排放置在阵列中 - 具有状态A的相同条形码的对象将位于左侧,下一个是具有状态B的对象,然后是具有状态C的对象。

如何编写排序函数来涵盖这两个步骤?

Kiosk k = new Kiosk();
k.Update().GetAwaiter().GetResult();

2 个答案:

答案 0 :(得分:1)

所以在比较器方法中你应该收到2个对象。现在做以下事情。

if(object1.barcode > object2.barcode)
    return false;
else if(object1.barcode < object2.barcode)
    return true;
else {
    if(object1.status > object2.status)
        return false;
    else
        return true;
}

答案 1 :(得分:1)

您可以简单地将比较链接起来:

let values: [Feed] = ...

let sortedValues: [Feed] = values.sorted { (feed1, feed2) in
    feed1.barcode < feed2.barcode
    || (feed1.barcode == feed2.barcode && feed1.status < feed2.status)
}

由于您使用的是Objective-C对象,因此您也可以使用旧的NSSortDescriptor。然而,它并没有与Swift联系,因此你需要一些施法魔法:

let barcodeSortDescriptor = NSSortDescriptor(key: "barcode", ascending: true)
let statusSortDescriptor = NSSortDescriptor(key: "status", ascending: true)

let sortedValues: [Feed] = (values as NSArray)
    .sortedArray(using: [barcodeSortDescriptor, statusSortDescriptor]) as! [Feed]

当您的排序更复杂时,这尤其有用。