Equatable
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 38 trên 57.
Equatable cung cấp cho một kiểu các toán tử == và !=. Với struct và enum có tất cả thuộc tính đều tuân theo Equatable, bạn chỉ cần khai báo sự tuân thủ, Swift sẽ so sánh từng thuộc tính:
struct Card: Equatable {
let rank: Int
let suit: String
}
let a = Card(rank: 10, suit: "hearts")
let b = Card(rank: 10, suit: "hearts")
print(a == b)
print(a != Card(rank: 2, suit: "hearts"))Đầu ra:
true
trueĐể chỉ so sánh một số thuộc tính, bạn hãy tự viết static func ==. Trong ví dụ này, hai người dùng bằng nhau khi ID của họ trùng khớp, bất kể tên là gì:
struct User: Equatable {
let id: Int
var name: String
static func == (lhs: User, rhs: User) -> Bool {
lhs.id == rhs.id
}
}
print(User(id: 1, name: "Ada") == User(id: 1, name: "Ada L."))
print(User(id: 1, name: "Ada") == User(id: 2, name: "Ada"))Đầu ra:
true
falseEquatable mở khóa các phương thức tiêu chuẩn cần phép so sánh, chẳng hạn như contains(_:), firstIndex(of:) và == trên toàn bộ mảng:
struct Point: Equatable {
let x: Int, y: Int
}
let path = [Point(x: 0, y: 0), Point(x: 1, y: 2)]
print(path.contains(Point(x: 1, y: 2)))
print(path.firstIndex(of: Point(x: 1, y: 2))!)
print(path == [Point(x: 0, y: 0), Point(x: 1, y: 2)])Đầu ra:
true
1
trueCác lớp không tự có ==: chúng so sánh danh tính bằng ===. Lớp cần so sánh theo giá trị phải tự triển khai ==:
class Color: Equatable {
let hex: String
init(hex: String) { self.hex = hex }
static func == (lhs: Color, rhs: Color) -> Bool { lhs.hex == rhs.hex }
}Thử thách
DễProduct có sku, name và price. Hai sản phẩm giống nhau khi sku của chúng trùng khớp, bất kể các trường khác có giá trị gì. Hãy cho Product tuân theo Equatable bằng cách tự định nghĩa ==, rồi hoàn thành mergeCatalog(_:). Hàm này giữ lại lần xuất hiện đầu tiên của mỗi sản phẩm (dùng contains) và trả về các dòng sku name price, theo sau là removed: 2.
Code được cung cấp đọc các sản phẩm dưới dạng những dòng sku,name,price và in ra từng dòng được trả về.
Hãy viết code trong Product.swift và Functions.swift. main.swift chứa code đầu vào/đầu ra được cung cấp và 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 cung cấp: giữ nguyên
var input: [String] = []
while let line = readLine() { input.append(line) }
let products = input.map { line -> Product in
let p = line.split(separator: ",").map(String.init)
return Product(sku: p[0], name: p[1], price: Int(p[2])!)
}
for line in mergeCatalog(products) { 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