2017-08-14 71 views
0

以下是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

回答

3

NSSortDescriptor的優點是,可以使用它們的數組進行排序,並且如果兩個對象轉出根據第一描述符爲相等,可以再回到屬於第二描述符對它們進行排序。

例如,假設您按修改日期排序了多個文件。如果兩個文件碰巧具有完全相同的修改日期,則可能需要按名稱對這兩個文件進行排序。所以你可以使用一系列排序描述符,第一個按日期排序,第二個按文件名排序。