Giao thức Equatable trong Swift là gì?

Đây là bài dịch từ trang medium.com, mời các bạn xem bài gốc tại đây: https://medium.com/better-programming/what-is-the-equatable-protocol-in-swift-f3238f6821d6

So sánh các đối tượng bằng nhau trong Swift một cách dễ dàng.

Trong hướng dẫn này, chúng ta sẽ cùng tìm hiểu về giao thức Equatable trong Swift một cách nhanh chóng thông qua các ví dụ trong Xcode Playground.

Giao thức Equatable cho phép chúng ta cung cấp một tính năng để so sánh các structclass mà chúng ta tạo ra trong Swift.

Bắt đầu

Giả sử chúng ta có một ứng dụng liệt kê các sản phẩm khác nhau mà người dùng có thể mua. Vì vậy, chúng ta tạo ra 2 struct ProductProductCategory:

struct Product {
    let category: ProductCategory
    let identifier: String
    let title: String
    let price: Double
}

struct ProductCategory {
    let id: String
}

Và khởi tạo các đối tượng:

let shoesCategory = ProductCategory(id: "shoes")
let clothingCategory = ProductCategory(id: "clothing")

let product1 = Product(category: shoesCategory, identifier: "product0001", title: "First product", price: 30.0)
let product2 = Product(category: clothingCategory, identifier: "product0002", title: "Second product", price: 45.0)

Bây giờ, nếu chúng ta muốn kiểm tra xem hai sản phẩm này có bằng nhau hay không, chúng ta viết một câu lệnh if khá dài như sau đây:

if product1.identifier == product2.identifier && product1.category.id == product2.category.id {
    print("Products are the same")
} else {
    print("Products are different")
}

Vậy có cách nào khác chúng ta có thể tối ưu hóa quá trình so sánh này không?

Tuân thủ giao thức Equatable

Để tuân thủ theo giao thức Equatable chúng ta phải thực thi môt phương thức bắt buộc ==:

extension Product: Equatable {
    public static func ==(lhs: Product, rhs: Product) -> Bool {
        return lhs.identifier == rhs.identifier
            && lhs.category.id == rhs.category.id
    }
}

Bây giờ, chúng ta có thể dễ dàng so sánh hai sản phẩm mà không cần viết câu lệnh if dài dòng như ở trên nữa:

let sampleProduct1 = Product(category: clothingCategory, identifier: "product0003", title: "Test product", price: 30.0)
let sampleProduct2 = Product(category: clothingCategory, identifier: "product0003", title: "Test product", price: 45.0)

if sampleProduct1 == sampleProduct2 {
    print("Products are the same")
} else {
    print("Products are different")
}

Kết thúc

Nếu bạn hứng thú với các kĩ thuật so sánh khác, vui lòng xem trong bài viết sau về giao thức Comparable tại đây: Khi nào nên sử dụng giao thức Comparable trong Swift

Để tìm hiểu thêm về giao thức Equatable, hãy truy cập tài liệu chính thức của Apple.

Cảm ơn vì đã đọc!

All Rights Reserved