Swift: Trier un tableau d'objets par ordre alphabétique
J'ai ceci:
class Movies {
Name:String
Date:Int
}
Et un tableau de [films]. Comment puis-je trier le tableau par ordre alphabétique par nom? J'ai essayé:
movieArr = movieArr.sorted{ $0 < $1 }
Et
movieArr = sorted(movieArr)
Mais cela ne fonctionne pas parce que je n'accède pas à l'attribut name des films.
4 réponses
Dans la fermeture que vous passez à sort, comparez les propriétés que vous souhaitez trier. Comme ceci:
movieArr.sorted { $0.name < $1.name }
Sidenote: Généralement seulement les types de commencer avec une lettre majuscule; je vous recommande d'utiliser name et date, pas Name et Date.
Exemple, dans un terrain de jeu:
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.sorted { $0.name < $1.name }
sortedMovies
sortedMovies sera dans l'ordre [movieA, movieB, movieC]
Avec Swift 3, vous pouvez choisir l'une des manières suivantes pour résoudre votre problème.
1. Utilisation sorted(by:) avec une classe Movie qui n'est pas conforme au protocole Comparable
Si votre classe Movie n'est pas conforme au protocole Comparable, vous devez spécifier dans votre fermeture la propriété sur laquelle vous souhaitez utiliser la méthode sorted(by:) de Array.
Movie déclaration de classe:
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
}
}
Utilisation:
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. À l'aide de sorted(by:) avec un Movie classe conforme au protocole Comparable
Cependant, en rendant votre classe Movie conforme au protocole Comparable, Vous pouvez avoir un code très concis lorsque vous souhaitez utiliser la méthode sorted(by:) de Array.
Movie déclaration de classe:
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
}
}
Utilisation:
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. Utilisation sorted() avec une classe Movie conforme au protocole Comparable
En rendant votre classe Movie conforme au protocole Comparable, Vous pouvez utiliser la méthode sorted() de Array comme alternative à sorted(by:).
Movie déclaration de classe:
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
}
}
Utilisation:
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]
*/
Pour ceux qui utilisent Swift 3, la méthode équivalente pour la réponse acceptée est:
movieArr.sorted { $0.Name < $1.Name }
let sortArray = array.sorted(by: { $0.name.lowercased() < $1.name.lowercased() })