NSSortDescriptor优于快速高阶函数的优点是什么?

问题描述:

以下是NSSortDescriptor的使用范例,它给出了与sortedByFirstNameSwifty相同的结果,那么在Swift中什么需要NSSortDescriptorNSSortDescriptor优于快速高阶函数的优点是什么?

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] 
+2

在'sort(by:)'快速实现的Swift中没有那么多。但它的一个优点是关于使用CoreData进行排序,在请求内部进行排序,而不是在排序之后。 – Larme

+1

对于分层排序(例如按姓氏排序,然后按名字排序),可以使用排序描述符数组。相应的排序关闭是一个稍微多一点的工作。另一方面,排序描述符只能用于NSObjects。 –

+0

@MartinR谢谢,是否包含在SWIFT中的'(peopleObject as NSArray)'很好? – Jack

NSSortDescriptor的优点是,可以使用它们的数组进行排序,并且如果两个对象转出根据第一描述符为相等,可以再回到属于第二描述符对它们进行排序。

例如,假设您按修改日期排序了多个文件。如果两个文件碰巧具有完全相同的修改日期,则可能需要按名称对这两个文件进行排序。所以你可以使用一系列排序描述符,第一个按日期排序,第二个按文件名排序。