Menu
CoddyTech

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
false

Equatable 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
true

Cá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 }
}
challenge icon

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) }
quiz iconTự kiểm tra

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

Tự luyện tập: Playground Swift