Swift: Ordenar una matriz de objects alfabéticamente

Tengo esto:

class Movies { Name:String Date:Int } 

y una variedad de [Películas]. ¿Cómo clasifico la matriz alfabéticamente por nombre? He intentado:

movieArr = movieArr.sorted{ $0 < $1 }

y

movieArr = sorted(movieArr)

pero eso no funciona porque no estoy accediendo al atributo de nombre de Películas.

En el cierre que pase para sort , compare las properties que desea orderar. Me gusta esto:

 movieArr.sort { $0.Name < $1.Name } 

Sidenote: Por lo general, solo los types comienzan con una letra mayúscula; Recomendaría usar name y date , no Name y Date .


Ejemplo, en un parque infantil:

 class Movie { let name: String var date: Int? init(_ name: String) { self.name = name } } var movieA = Movie("A") var movieB = Movie("B") var movieC = Movie("C") let movies = [movieB, movieC, movieA] let sortedMovies = movies.sort { $0.name < $1.name } sortedMovies 

sortedMovies estará en el order [movieA, movieB, movieC]

Con Swift 3, puede elegir una de las siguientes forms para resolver su problema.


1. Usando sorted(by:​) con una class de Movie que no cumple con el protocolo Comparable

Si su class de Movie no cumple con el protocolo Comparable , debe especificar en su cierre la propiedad en la que desea utilizar el método sorted(by:​) 🙂 de Array.

Declaración de class de Movie :

 import Foundation class Movie: CustomStringConvertible { let name: String var date: Date var description: String { return name } init(name: String, date: Date = Date()) { self.name = name self.date = date } } 

Uso:

 let avatarMovie = Movie(name: "Avatar") let titanicMovie = Movie(name: "Titanic") let piranhaMovie = Movie(name: "Piranha II: The Spawning") let movies = [avatarMovie, titanicMovie, piranhaMovie] let sortedMovies = movies.sorted(by: { $0.name < $1.name }) // let sortedMovies = movies.sorted { $0.name < $1.name } // also works print(sortedMovies) /* prints: [Avatar, Piranha II: The Spawning, Titanic] */ 

2. Usando sorted(by:​) con una class de Movie que cumple con el protocolo Comparable

Sin embargo, al hacer que su class de Movie cumpla con el protocolo Comparable , puede tener un código mucho más conciso cuando quiera usar el método sorted(by:​) 🙂 de Array.

Declaración de class de Movie :

 import Foundation class Movie: CustomStringConvertible, Comparable { let name: String var date: Date var description: String { return name } init(name: String, date: Date = Date()) { self.name = name self.date = date } static func ==(lhs: Movie, rhs: Movie) -> Bool { return lhs.name == rhs.name } static func <(lhs: Movie, rhs: Movie) -> Bool { return lhs.name < rhs.name } } 

Uso:

 let avatarMovie = Movie(name: "Avatar") let titanicMovie = Movie(name: "Titanic") let piranhaMovie = Movie(name: "Piranha II: The Spawning") let movies = [avatarMovie, titanicMovie, piranhaMovie] let sortedMovies = movies.sorted(by: { $0 < $1 }) // let sortedMovies = movies.sorted { $0 < $1 } // also works // let sortedMovies = movies.sorted(by: <) // also works print(sortedMovies) /* prints: [Avatar, Piranha II: The Spawning, Titanic] */ 

3. Usando sorted() con una class de Movie que cumple con el protocolo Comparable

Al hacer que su class de Movie ajuste al protocolo Comparable , puede usar el método sorted() Array como una alternativa a sorted(by:​) .

Declaración de class de Movie :

 import Foundation class Movie: CustomStringConvertible, Comparable { let name: String var date: Date var description: String { return name } init(name: String, date: Date = Date()) { self.name = name self.date = date } static func ==(lhs: Movie, rhs: Movie) -> Bool { return lhs.name == rhs.name } static func <(lhs: Movie, rhs: Movie) -> Bool { return lhs.name < rhs.name } } 

Uso:

 let avatarMovie = Movie(name: "Avatar") let titanicMovie = Movie(name: "Titanic") let piranhaMovie = Movie(name: "Piranha II: The Spawning") let movies = [avatarMovie, titanicMovie, piranhaMovie] let sortedMovies = movies.sorted() print(sortedMovies) /* prints: [Avatar, Piranha II: The Spawning, Titanic] */ 

Para aquellos que usan Swift 3, el método equivalente para la respuesta aceptada es:

 movieArr.sorted { $0.Name < $1.Name } 

Swift 4

Han cambiado la syntax poco desde Swift 3. Aquí está la versión Swift 4 de la línea.

 MovieArr.sort(by: { $0.name < $1.name })