Digamos que tenemos una clase personalizada llamada imageFile y esta clase contiene dos propiedades.
class imageFile {
var fileName = String()
var fileID = Int()
}
muchos de ellos almacenados en Array
var images : Array = []
var aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 101
images.append(aImage)
aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 202
images.append(aImage)
la pregunta es: ¿cómo puedo ordenar la matriz de imágenes por 'fileID' ASC o DESC?
Respuestas:
Primero, declare su matriz como una matriz escrita para que pueda llamar a los métodos cuando itera:
Entonces simplemente puedes hacer:
Swift 2
Swift 3+
El ejemplo anterior muestra el orden de clasificación desc
fuente
NSManagedObject
subclase llamada CheckInAndOut . Y en un archivo separado, he declarado una matriz escrita para objetos de este tipo y cuando trato de ordenarlo , aparece un error No se pudo encontrar el miembro . ¿Alguna idea de por qué es esto?firstName
ylastName
en una matriz dePerson
objetos. Primero quiero ordenarlofirstName
y luegolastName
. ¿Cómo puedo hacer esto?images.sortInPlace({ $0.fileID > $1.fileID })
?[ Actualizado para Swift 3 con sort (by :) ] Esto, explotando un cierre final:
donde usa
<
o>
depende de ASC o DESC, respectivamente. Si desea modificar laimages
matriz , use lo siguiente:Si va a hacer esto repetidamente y prefiere definir una función, una forma es:
y luego usar como:
fuente
sort
ya no se compila con esta sintaxis en Xcode 8. Xcode 8 dice que$0.fileID < $1.fileID
produce un resultado Bool no ComparisonResult.Casi todos dan cómo directamente, déjenme mostrarles la evolución:
puede usar los métodos de instancia de Array:
Para obtener una explicación detallada sobre el principio de funcionamiento del ordenamiento, consulte La función ordenada .
fuente
Swift 3
fuente
people.sort { $0.email > $1.email }
Con Swift 5,
Array
tiene dos métodos llamadossorted()
ysorted(by:)
. El primer método,sorted()
tiene la siguiente declaración:El segundo método,
sorted(by:)
tiene la siguiente declaración:# 1 Ordenar con orden ascendente para objetos comparables
Si el tipo de elemento dentro de su colección se ajusta al
Comparable
protocolo, podrá usarlosorted()
para ordenar sus elementos en orden ascendente. El siguiente código de Playground muestra cómo usarsorted()
:# 2 Ordenar con orden descendente para objetos comparables
Si el tipo de elemento dentro de su colección se ajusta al
Comparable
protocolo, deberá usarlosorted(by:)
para ordenar sus elementos con un orden descendente.# 3 Ordenar con orden ascendente o descendente para objetos no comparables
Si el tipo de elemento dentro de su colección NO se ajusta al
Comparable
protocolo, deberá usarlosorted(by:)
para ordenar sus elementos en orden ascendente o descendente.Tenga en cuenta que Swift también proporciona dos métodos llamados
sort()
ysort(by:)
como contrapartes desorted()
ysorted(by:)
si necesita ordenar su colección en el lugar.fuente
En Swift 3.0
fuente
También puedes hacer algo como
por lo que su matriz de imágenes se almacenará ordenada
fuente
Swift 2 a 4
La respuesta original buscaba ordenar una matriz de objetos personalizados usando alguna propiedad. A continuación, le mostraré algunas maneras prácticas de hacer este mismo comportamiento con estructuras de datos rápidas.
Pequeñas cosas fuera del camino, cambié ImageFile muy ligeramente. Con eso en mente, creo una matriz con tres archivos de imagen. Tenga en cuenta que los metadatos son un valor opcional, pasando nil como se espera un parámetro.
ImageFile tiene una propiedad llamada size. Para los siguientes ejemplos, le mostraré cómo usar operaciones de clasificación con propiedades como tamaño.
tamaño más pequeño a más grande (<)
mayor a menor (>)
A continuación, ordenaremos utilizando el nombre de la propiedad String. De la misma manera, use sort para comparar cadenas. Pero observe que el bloque interno devuelve un resultado de comparación. Este resultado definirá la ordenación.
AZ (.orderedAscending)
ZA (.orderedDescending)
La siguiente es mi forma favorita de ordenar, en muchos casos uno tendrá propiedades opcionales. Ahora no se preocupe, vamos a ordenar de la misma manera que antes, ¡excepto que tenemos que manejar nulo! En producción;
Usé este código para forzar que todas las instancias en mi matriz con valores de propiedad nulos sean las últimas. Luego ordene los metadatos utilizando los supuestos valores sin envolver.
Es posible tener una clasificación secundaria para opcionales. Por ejemplo; se podrían mostrar imágenes con metadatos y ordenadas por tamaño.
fuente
Dos alternativas
1) Ordenar la matriz original con sortInPlace
2) Usar una matriz alternativa para almacenar la matriz ordenada
fuente
var assignmentsO : [Assignment]
o combinar en una sola línea mediante el uso delet assignmentsO = self.assignments.sort({ $0.order < $1.order })
Swift 4.0, 4.1 y 4.2 Primero, creé una matriz mutable de tipo imageFile () como se muestra a continuación
Cree una imagen de objeto mutable de tipo imageFile () y asigne valor a las propiedades como se muestra a continuación
Ahora, agregue este objeto a la matriz arr
Ahora, asigne las diferentes propiedades al mismo objeto mutable, es decir, imagen
Ahora, agregue nuevamente el objeto de imagen al arreglo arr
Ahora, aplicaremos el orden Ascendente en la propiedad fileId en los objetos arr de la matriz. Use el símbolo < para orden ascendente
Ahora, aplicaremos el orden Descendente en la propiedad fileId en los objetos de matriz arr. Use el símbolo> para orden descendente
En Swift 4.1. & 4.2 Para uso de orden ordenada
fuente
Si va a ordenar esta matriz en más de un lugar, puede tener sentido hacer que su tipo de matriz sea Comparable.
fuente
Si no está utilizando objetos personalizados, sino tipos de valores que implementan un protocolo comparable (Int, String, etc.), simplemente puede hacer esto:
Un ejemplo:
fuente
myArray.sorted(by: >)
Devuelve una matriz ordenada de la propiedad fileID de la siguiente manera:
Swift 2
Swift 3 o 4
Swift 5.0
fuente
Lo hago así y funciona:
var images = [imageFile]() images.sorted(by: {$0.fileID.compare($1.fileID) == .orderedAscending })
fuente
Si desea ordenar la matriz original de objetos personalizados. Aquí hay otra forma de hacerlo en Swift 2.1
¿Dónde
id
está un número entero? También puede usar el mismo<
operador para lasString
propiedades.Puede obtener más información sobre su uso mirando un ejemplo aquí: Swift2: Clientes cercanos
fuente
Impresiones:
"["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"
fuente
Swift 3 y 4 y 5
Tuve algún problema relacionado con minúsculas y mayúsculas
entonces hice este código
y luego usar imágenes ordenadas después de eso
fuente
Ordenar usando KeyPath
puedes ordenar de
KeyPath
esta manera:Al implementar esta pequeña extensión útil.
Hope Swift agregará esto en un futuro cercano en el núcleo del lenguaje.
fuente
public extension MutableCollection where Self: RandomAccessCollection { mutating func sort<T>(_ keyPath: KeyPath<Element, T>, by areInIncreasingOrder: (T, T) throws -> Bool) rethrows where T: Comparable { try sort { try areInIncreasingOrder($0[keyPath: keyPath], $1[keyPath: keyPath]) } }}