J'ai ceci:
class Movies {
Name:String
Date:Int
}
et un tableau de [Films]. Comment trier le tableau alphabétiquement par nom? J'ai essayé:
movieArr = movieArr.sorted{ $0 < $1 }
et
movieArr = sorted(movieArr)
mais cela ne fonctionne pas parce que je n'ai pas accès à l'attribut name de Movies.
Dans la fermeture que vous passez à sort
, comparez les propriétés que vous souhaitez trier. Comme ça:
movieArr.sorted { $0.name < $1.name }
ou les éléments suivants dans les cas où vous souhaitez contourner les cas:
movieArr.sorted { $0.name.lowercased() < $1.name.lowercased() }
Sidenote: Typiquement, seuls les types commencent par une lettre majuscule; Je recommanderais d'utiliser name
et date
, et non Name
et Date
.
Exemple, dans une aire de jeux:
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’un des moyens suivants pour résoudre votre problème.
sorted(by:)
avec une classe Movie
non conforme au protocole Comparable
Si votre classe Movie
n'est pas conforme au protocole Comparable
, vous devez spécifier dans votre clôture 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
}
}
Usage:
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]
*/
sorted(by:)
avec une classe Movie
conforme au protocole Comparable
Cependant, en rendant votre classe Movie
conforme au protocole Comparable
, vous pouvez avoir un code beaucoup plus 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
}
}
Usage:
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]
*/
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 au lieu de 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
}
}
Usage:
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]
*/
let sortArray = array.sorted(by: { $0.name.lowercased() < $1.name.lowercased() })
Pour ceux qui utilisent Swift 3, la méthode équivalente pour la réponse acceptée est la suivante:
movieArr.sorted { $0.Name < $1.Name }
Tableau trié Swift 4.2
arrayOfRaces = arrayOfItems.sorted(by: { ($0["raceName"] as! String) < ($1["raceName"] as! String) })