NSSortDescriptor优于快速高阶函数的优点是什么?
问题描述:
以下是NSSortDescriptor
的使用范例,它给出了与sortedByFirstNameSwifty
相同的结果,那么在Swift中什么需要NSSortDescriptor
?NSSortDescriptor优于快速高阶函数的优点是什么?
class Person: NSObject {
let firstName: String
let lastName: String
let age: Int
init(firstName: String, lastName: String, age: Int) {
self.firstName = firstName
self.lastName = lastName
self.age = age
}
override var description: String {
return "\(firstName) \(lastName)"
}
}
let a = Person(firstName: "a", lastName: "b", age: 24)
let b = Person(firstName: "c", lastName: "d", age: 27)
let c = Person(firstName: "e", lastName: "f", age: 33)
let d = Person(firstName: "g", lastName: "h", age: 31)
let peopleObject = [d, b, a, c]
//SWIFTY
let sortedByFirstNameSwifty = peopleObject.sorted(by: { $0.firstName < $1.firstName })
print(sortedByFirstNameSwifty)//prints[a b, c d, e f, g h]
//Objective c way
let firstNameSortDescriptor = NSSortDescriptor(key: "firstName", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))
let sortedByFirstName = (peopleObject as NSArray).sortedArray(using: [firstNameSortDescriptor])
print(sortedByFirstName)//prints [a b, c d, e f, g h]
答
NSSortDescriptor的优点是,可以使用它们的数组进行排序,并且如果两个对象转出根据第一描述符为相等,可以再回到属于第二描述符对它们进行排序。
例如,假设您按修改日期排序了多个文件。如果两个文件碰巧具有完全相同的修改日期,则可能需要按名称对这两个文件进行排序。所以你可以使用一系列排序描述符,第一个按日期排序,第二个按文件名排序。
在'sort(by:)'快速实现的Swift中没有那么多。但它的一个优点是关于使用CoreData进行排序,在请求内部进行排序,而不是在排序之后。 – Larme
对于分层排序(例如按姓氏排序,然后按名字排序),可以使用排序描述符数组。相应的排序关闭是一个稍微多一点的工作。另一方面,排序描述符只能用于NSObjects。 –
@MartinR谢谢,是否包含在SWIFT中的'(peopleObject as NSArray)'很好? – Jack