2017-08-14 1 views
0

Ci-dessous est l'exemple d'utilisation de NSSortDescriptor qui donne le même résultat que sortedByFirstNameSwifty alors quel est le besoin de NSSortDescriptor dans Swift?Quel est l'avantage de NSSortDescriptor sur la fonction Swift High?

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

Pas tellement dans Swift où 'trié (par:)' est rapide à implémenter. Mais l'un de ses avantages est de trier avec CoreData, en faisant le tri dans la requête et non après. – Larme

+1

Pour un tri hiérarchique (par exemple tri par nom de famille, puis par prénom), vous pouvez utiliser un tableau de descripteurs de tri. La fermeture de tri correspondante est un peu plus de travail. - D'autre part, les descripteurs de tri ne peuvent être utilisés qu'avec NSObjects. –

+0

@MartinR merci, est-ce bon d'inclure '(peopleObject as NSArray)' cast dans SWIFT? – Jack

Répondre

3

L'avantage de NSSortDescriptor est que vous pouvez trier en utilisant un tableau d'entre eux, et si deux objets se révèlent être égaux selon le premier descripteur, vous pouvez alors se rabattre sur le deuxième descripteur pour les trier. Par exemple, disons que vous étiez en train de trier un certain nombre de fichiers par date de modification. Dans le cas où deux fichiers ont exactement la même date de modification, vous pouvez trier ces deux fichiers par nom à la place. Vous utiliserez donc un tableau de descripteurs de tri, le premier triant par date et le second trié par nom de fichier.