Comparable
Thuộc phần Lập trình hướng đối tượng trong hành trình Swift của Coddy. Bài học 39 trên 57.
Comparable cung cấp cho một kiểu các toán tử <, <=, > và >=. Bạn chỉ cần triển khai <; Swift sẽ suy ra các toán tử còn lại. Bạn có thể sắp xếp các kiểu Comparable bằng sorted() và dùng chúng với min() và max():
struct Version: Comparable {
let major: Int, minor: Int
static func < (lhs: Version, rhs: Version) -> Bool {
(lhs.major, lhs.minor) < (rhs.major, rhs.minor)
}
}
let versions = [Version(major: 2, minor: 1), Version(major: 1, minor: 9), Version(major: 2, minor: 0)]
let newest = versions.max()!
print("\(newest.major).\(newest.minor)")
print(versions.sorted().map { "\($0.major).\($0.minor)" })Đầu ra:
2.1
["1.9", "2.0", "2.1"]So sánh các tuple sẽ so sánh lần lượt từng phần, giúp việc so sánh nhiều khóa trở nên ngắn gọn. Ở đây, các tác vụ được sắp xếp theo độ ưu tiên trước, rồi theo tên:
struct Task: Comparable {
let priority: Int
let name: String
static func < (lhs: Task, rhs: Task) -> Bool {
(lhs.priority, lhs.name) < (rhs.priority, rhs.name)
}
}
let tasks = [Task(priority: 2, name: "email"), Task(priority: 1, name: "fix"), Task(priority: 2, name: "call")]
print(tasks.sorted().map { $0.name })Đầu ra:
["fix", "call", "email"]Các enum không có giá trị đi kèm có thể tuân thủ Comparable mà không cần viết <: các trường hợp được so sánh theo thứ tự khai báo:
enum Priority: Comparable {
case low, medium, high
}
print(Priority.low < Priority.high)
print([Priority.high, .low, .medium].sorted())Đầu ra:
true
[main.Priority.low, main.Priority.medium, main.Priority.high]sorted(by:) sắp xếp theo quy tắc bất kỳ trong một lần gọi, còn Comparable xác định thứ tự tự nhiên của kiểu dữ liệu mà sorted(), min() và max() sử dụng ở mọi nơi:
struct Task: Comparable {
let priority: Int
let name: String
static func < (lhs: Task, rhs: Task) -> Bool { lhs.priority < rhs.priority }
}
let tasks = [Task(priority: 3, name: "c"), Task(priority: 1, name: "a")]
print(tasks.sorted().map { $0.name })
print(tasks.sorted(by: >).map { $0.name })Đầu ra:
["a", "c"]
["c", "a"]Thử thách
DễHãy làm cho Runner (tên và thời gian về đích gồm minutes, seconds) tuân theo Comparable, trong đó thời gian nhanh hơn được xem là nhỏ hơn và nếu thời gian bằng nhau thì sắp xếp theo tên. Hoàn thành podium(_:), hàm này sắp xếp các vận động viên bằng sorted() và trả về các dòng có dạng 1. Ada 20:05 cho ba người đầu tiên (ít hơn nếu có ít người hơn), với số giây được thêm số 0 ở đầu để đủ hai chữ số.
Code được cung cấp đọc các dòng theo định dạng name,mm:ss và in ra từng dòng được trả về.
Code của bạn đặt trong Runner.swift và Functions.swift. main.swift chứa code đầu vào và đầu ra được cung cấp, bạn không thể chỉnh sửa tệp này.
Tự làm thử
// Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
var input: [String] = []
while let line = readLine() { input.append(line) }
let runners = input.map { line -> Runner in
let p = line.split(separator: ",").map(String.init)
let t = p[1].split(separator: ":").map { Int($0)! }
return Runner(name: p[0], minutes: t[0], seconds: t[1])
}
for line in podium(runners) { print(line) }
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpPhương thức và selfHàm khởi tạoLớp là tham chiếuÔn tập: Thẻ thư viện2Struct và kiểu giá trị
StructNgữ nghĩa giá trịPhương thức thay đổiStruct hay classÔn tập: mặt hàng trong kho5Kế thừa
Lớp conGhi đè phương thứcHàm khởi tạo và superfinal và hệ phân cấpÔn tập: hệ phân cấp nhân viên8Các giao thức tiêu chuẩn
CustomStringConvertibleEquatableComparableHashableÔn tập: Sắp xếp tùy chỉnhTự luyện tập: Playground Swift