这是我在开发 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;
}