Avec Swift 5, Array
a deux méthodes appelées sorted()
et sorted(by:)
. La première méthode, sorted()
a la déclaration suivante:
Renvoie les éléments de la collection, triés.
func sorted() -> [Element]
La deuxième méthode, sorted(by:)
a la déclaration suivante:
Renvoie les éléments de la collection, triés en utilisant le prédicat donné comme comparaison entre les éléments.
func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]
#1. Trier par ordre croissant pour des objets comparables
Si le type d'élément de votre collection est conforme au Comparable
protocole, vous pourrez l'utiliser sorted()
pour trier vos éléments par ordre croissant. Le code Playground suivant montre comment utiliser sorted()
:
class ImageFile: CustomStringConvertible, Comparable {
let fileName: String
let fileID: Int
var description: String { return "ImageFile with ID: \(fileID)" }
init(fileName: String, fileID: Int) {
self.fileName = fileName
self.fileID = fileID
}
static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
return lhs.fileID == rhs.fileID
}
static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
return lhs.fileID < rhs.fileID
}
}
let images = [
ImageFile(fileName: "Car", fileID: 300),
ImageFile(fileName: "Boat", fileID: 100),
ImageFile(fileName: "Plane", fileID: 200)
]
let sortedImages = images.sorted()
print(sortedImages)
/*
prints: [ImageFile with ID: 100, ImageFile with ID: 200, ImageFile with ID: 300]
*/
# 2. Trier par ordre décroissant pour des objets comparables
Si le type d'élément à l'intérieur de votre collection est conforme au Comparable
protocole, vous devrez utiliser sorted(by:)
afin de trier vos éléments avec un ordre décroissant.
class ImageFile: CustomStringConvertible, Comparable {
let fileName: String
let fileID: Int
var description: String { return "ImageFile with ID: \(fileID)" }
init(fileName: String, fileID: Int) {
self.fileName = fileName
self.fileID = fileID
}
static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
return lhs.fileID == rhs.fileID
}
static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
return lhs.fileID < rhs.fileID
}
}
let images = [
ImageFile(fileName: "Car", fileID: 300),
ImageFile(fileName: "Boat", fileID: 100),
ImageFile(fileName: "Plane", fileID: 200)
]
let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
return img0 > img1
})
//let sortedImages = images.sorted(by: >) // also works
//let sortedImages = images.sorted { $0 > $1 } // also works
print(sortedImages)
/*
prints: [ImageFile with ID: 300, ImageFile with ID: 200, ImageFile with ID: 100]
*/
# 3. Trier par ordre croissant ou décroissant pour les objets non comparables
Si le type d'élément dans votre collection n'est PAS conforme au Comparable
protocole, vous devrez l'utiliser sorted(by:)
pour trier vos éléments par ordre croissant ou décroissant.
class ImageFile: CustomStringConvertible {
let fileName: String
let fileID: Int
var description: String { return "ImageFile with ID: \(fileID)" }
init(fileName: String, fileID: Int) {
self.fileName = fileName
self.fileID = fileID
}
}
let images = [
ImageFile(fileName: "Car", fileID: 300),
ImageFile(fileName: "Boat", fileID: 100),
ImageFile(fileName: "Plane", fileID: 200)
]
let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
return img0.fileID < img1.fileID
})
//let sortedImages = images.sorted { $0.fileID < $1.fileID } // also works
print(sortedImages)
/*
prints: [ImageFile with ID: 300, ImageFile with ID: 200, ImageFile with ID: 100]
*/
Notez que Swift fournit également deux méthodes appelées sort()
et en sort(by:)
tant que contreparties de sorted()
et sorted(by:)
si vous devez trier votre collection sur place.