Với Swift 5, Array
có hai phương thức được gọi sorted()
và sorted(by:)
. Phương thức đầu tiên sorted()
, có khai báo sau:
Trả về các phần tử của bộ sưu tập, được sắp xếp.
func sorted() -> [Element]
Phương thức thứ hai sorted(by:)
, có khai báo sau:
Trả về các phần tử của bộ sưu tập, được sắp xếp bằng cách sử dụng vị từ đã cho làm so sánh giữa các phần tử.
func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]
# 1. Sắp xếp theo thứ tự tăng dần cho các đối tượng so sánh
Nếu loại phần tử bên trong bộ sưu tập của bạn tuân thủ Comparable
giao thức, bạn sẽ có thể sử dụng sorted()
để sắp xếp các phần tử của mình theo thứ tự tăng dần. Mã Playground sau đây cho biết cách sử dụng 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. Sắp xếp theo thứ tự giảm dần cho các đối tượng so sánh
Nếu loại phần tử bên trong bộ sưu tập của bạn tuân thủ Comparable
giao thức, bạn sẽ phải sử dụng sorted(by:)
để sắp xếp các phần tử của mình theo thứ tự giảm dần.
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. Sắp xếp theo thứ tự tăng dần hoặc giảm dần cho các đối tượng không thể so sánh
Nếu loại phần tử bên trong bộ sưu tập của bạn KHÔNG tuân thủ Comparable
giao thức, bạn sẽ phải sử dụng sorted(by:)
để sắp xếp các phần tử của mình theo thứ tự tăng dần hoặc giảm dần.
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]
*/
Lưu ý rằng Swift cũng cung cấp hai phương thức được gọi sort()
và sort(by:)
là đối tác của sorted()
và sorted(by:)
nếu bạn cần sắp xếp bộ sưu tập của mình tại chỗ.