sport sort objects array sorting swift nsarray

sorting - objects - Ordenar NSArray con sortedArrayUsingComparator



swift 4 sort array of objects (5)

Así que trata de escribir lo mismo con Swift:

var sortedArray:NSArray = persons.sortedArrayUsingComparator(){(p1:AnyObject!, p2:AnyObject!) -> NSComparisonResult in if (p1 as Person).name > (p2 as Person).name { return NSComparisonResult.OrderedDescending } if (p1 as Person).name < (p2 as Person).name { return NSComparisonResult.OrderedAscending } return NSComparisonResult.OrderedAscending }

Prueba (Zona de juegos):

class Person{ var name:String? } var p1:Person = Person() p1.name = "a" var p3:Person = Person() p3.name = "c" var p2:Person = Person() p2.name = "b" var persons:NSArray = [p1,p3,p2] var sortedArray:NSArray = persons.sortedArrayUsingComparator(){ (p1:AnyObject!, p2:AnyObject!) -> NSComparisonResult in if (p1 as Person).name > (p2 as Person).name { return NSComparisonResult.OrderedDescending } if (p1 as Person).name < (p2 as Person).name { return NSComparisonResult.OrderedAscending } return NSComparisonResult.OrderedAscending } for item:AnyObject in sortedArray{ println((item as Person).name) }

Salida:

Optional("a") Optional("b") Optional("c")

En Objective-C puedo ordenar una NSArray usando esta declaración:

NSArray *sortedArray = [persons sortedArrayUsingComparator:^NSComparisonResult(Person *p1, Person *p2) { return [p1.name compare:p2.name]; }];

No puedo reproducir la misma declaración con Swift . Todo lo que encontré fue usando Array .


En Swift puedes usar un nuevo enfoque. Trate de usar el método ordenado en lugar de ordenado ArrayUsingComparator como este ...

var sortedArray = results.sorted { (obj1, obj2) -> Bool in return obj1.count! > obj2.count! }


En caso de que tengas un objeto personalizado y quieras ordenar por fecha.

let sortedArray = self.posts.sorted { (obj1, obj2) -> Bool in return (obj1 as! PostModel).orderCancellionDate.compare( (obj2 as! PostModel).orderCancellionDate) == .orderedDescending }


No hay necesidad de evitar Swift Array .

Se une en ambas direcciones con NSArray , por lo que para obtener un código más seguro, es mejor hacer su trabajo con arrays Swift y puente solo cuando sea necesario para interoperar con las API de ObjC. (Y en la mayoría de las API importadas, Swift convierte automáticamente NSArray a [AnyObject] , por lo que ni siquiera necesita un puente muy a menudo).

Suponiendo que la matriz de persons es un [AnyObject] que obtuviste de otra API, puedes reducir la cantidad de conversión de tipos en relación con otras respuestas lanzando primero la matriz:

let sortedPersons = sorted(persons as [Person]) { $0.name < $1.name } // sortedPersons has inferred type [Person]

Además, dado que está utilizando un bloque de comparación solo para ordenar en una propiedad específica de su clase de Person , podría hacer mejor uso de descriptores de clasificación:

let sortedPersons = (persons as NSArray).sortedArrayUsingDescriptors([ NSSortDescriptor(key: "name", ascending: true) ])

(Las persons as NSArray parte de persons as NSArray pueden no ser necesarias si las persons provienen de una API de ObjC).

Dependiendo de cómo se implementa la clase Person , la clasificación con descriptores puede producir una clasificación más eficiente en el backend. Por ejemplo, si se trata de un objeto administrado de Core Data, la clasificación con descriptores puede producir una consulta SQL que se ejecuta rápidamente en la base de datos y utiliza poca memoria, mientras que la clasificación con un cierre de comparador requiere la creación de instancias de cada objeto de la base de datos solo para evaluar el cierre de cada base. .


Puede usar las funciones de clasificación incorporadas de Swift o, dado que una matriz Swift está enlazada a NSArray , puede llamar a sortedArrayUsingComparator desde swift directamente.

Usando la función sorted de Swift:

var sortedArray = sorted(persons) { (obj1, obj2) in // The downcast to Person is only needed if persons is an NSArray or a Swift Array of AnyObjects let p1 = obj1 as Person let p2 = obj2 as Person return p1.name < p2.name }

O, usando el sortedArrayUsingComparator uso sortedArrayUsingComparator NSArray :

var sortedArray = persons.sortedArrayUsingComparator { (obj1, obj2) -> NSComparisonResult in let p1 = obj1 as Person let p2 = obj2 as Person let result = p1.name.compare(p2.name) return result }