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



这是我在开发 Swift 3 时遇到的一个排序问题。我有一个包含许多对象的数组,称为 Feed,如下所示。排序方法应包括 2 个步骤:- 具有相同条形码的对象将在数组中并排放置- 具有相同条形码且状态为 A 的对象将站在左侧,下一个是具有状态 B 的对象,然后是具有状态 C 的对象。

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

class Feed: Object {
    dynamic var barcode: Int
    dynamic var feed_type = ""
    dynamic var status: String 
    override class func primaryKey() -> String {
        return "id"
    }
    var type: FeedType {
        get {
            return FeedType.get(feed_type)
        }
        set(newValue) {
            feed_type = newValue.key
        }
    }
}

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

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。但是,它没有桥接到斯威夫特,因此您需要一些施法魔法:

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]

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

因此,

在比较器方法中,您应该接收 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;
}

最新更新