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
truePara 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
falseEquatable 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
trueLas 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 }
}Desafío
FácilProduct 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) }
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
1Clases y objetos
Trabajar con archivosDefinir clasesMétodos y selfInicializadoresLas clases son referenciasRepaso: tarjeta de biblioteca4Encapsulación
Control de accesoSolo lectura desde fueraProtección del estadoInicializadores que pueden fallarRepaso - Cuenta bancaria7Polimorfismo y genéricos
PolimorfismoConversión de tiposFunciones genéricasTipos genéricosRepaso - Calculadora de formas2Structs y tipos por valor
StructsSemántica de valoresMétodos mutablesStruct o claseRepaso - elemento del inventario5Herencia
SubclasesSobrescritura de métodosInicializadores y superfinal y jerarquíasRepaso: jerarquía de empleados8Protocolos estándar
CustomStringConvertibleEquatableComparableHashableRepaso - Ordenamiento personalizado11Proyecto: Gestión de bibliotecas
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Swift