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() })