Con Swift 5, Array
tiene dos métodos llamados sorted()
y sorted(by:)
. El primer método, sorted()
tiene la siguiente declaración:
Devuelve los elementos de la colección, ordenados.
func sorted() -> [Element]
El segundo método, sorted(by:)
tiene la siguiente declaración:
Devuelve los elementos de la colección, ordenados usando el predicado dado como la comparación entre elementos.
func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]
# 1 Ordenar con orden ascendente para objetos comparables
Si el tipo de elemento dentro de su colección se ajusta al Comparable
protocolo, podrá usarlo sorted()
para ordenar sus elementos en orden ascendente. El siguiente código de Playground muestra cómo usar 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 Ordenar con orden descendente para objetos comparables
Si el tipo de elemento dentro de su colección se ajusta al Comparable
protocolo, deberá usarlo sorted(by:)
para ordenar sus elementos con un orden descendente.
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 Ordenar con orden ascendente o descendente para objetos no comparables
Si el tipo de elemento dentro de su colección NO se ajusta al Comparable
protocolo, deberá usarlo sorted(by:)
para ordenar sus elementos en orden ascendente o descendente.
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]
*/
Tenga en cuenta que Swift también proporciona dos métodos llamados sort()
y sort(by:)
como contrapartes de sorted()
y sorted(by:)
si necesita ordenar su colección en el lugar.