Menu
Coddy logo textTech

Equatable

Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 38 de 57.

Equatable proporciona a un tipo los operadores == y !=. Para las estructuras y enumeraciones cuyas propiedades son todas Equatable, basta con declarar la conformidad, y Swift compara cada propiedad:

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"))

Salida:

true
true

Para comparar solo algunas propiedades, escribe tú mismo static func ==. Aquí dos usuarios son iguales cuando sus ids coinciden, independientemente de sus nombres:

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"))

Salida:

true
false

Equatable habilita métodos estándar que necesitan comparación, como contains(_:), firstIndex(of:) y == en arrays completos:

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)])

Salida:

true
1
true

Las clases no obtienen == automáticamente: comparan la identidad con ===. Una clase que deba compararse por valor debe implementar == por sí misma:

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

Desafío

Fácil

Product tiene sku, name y price. Dos productos son iguales cuando su sku coincide, independientemente de lo que indiquen los demás campos. Haz que Product cumpla con Equatable mediante un == personalizado y, después, completa mergeCatalog(_:), que conserva la primera aparición de cada producto (usando contains) y devuelve líneas con sku name price, seguidas de removed: 2.

El código proporcionado lee los productos como líneas con el formato sku,name,price e imprime cada línea devuelta.

Tu código debe ir en Product.swift y Functions.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

// Código de entrada/salida suministrado: déjalo tal como está
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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Playground de Swift