Equatable
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 38 de 57.
Equatable fornece a um tipo os operadores == e !=. Para structs e enums cujas propriedades são todas Equatable, declarar a conformidade é suficiente, e o Swift compara cada propriedade:
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"))Saída:
true
truePara comparar apenas algumas propriedades, escreva static func == por conta própria. Aqui, dois usuários são iguais quando seus ids correspondem, independentemente de seus nomes:
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"))Saída:
true
falseEquatable habilita métodos padrão que precisam de comparação, como contains(_:), firstIndex(of:) e == em arrays inteiros:
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)])Saída:
true
1
trueAs classes não recebem == gratuitamente: elas comparam a identidade com ===. Uma classe que deve ser comparada por valor precisa implementar == por conta própria:
class Color: Equatable {
let hex: String
init(hex: String) { self.hex = hex }
static func == (lhs: Color, rhs: Color) -> Bool { lhs.hex == rhs.hex }
}Desafio
FácilProduct tem sku, name e price. Dois produtos são iguais quando seus sku coincidem, independentemente do que os outros campos informam. Faça Product estar em conformidade com Equatable usando um == personalizado e, em seguida, conclua mergeCatalog(_:), que mantém a primeira ocorrência de cada produto (usando contains) e retorna linhas no formato sku name price, seguidas por removed: 2.
O código fornecido lê os produtos como linhas no formato sku,name,price e imprime cada linha retornada.
Seu código deve ser colocado em Product.swift e Functions.swift. main.swift contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
// Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesMétodos e selfInicializadoresClasses são ReferênciasRevisão - Cartão da Biblioteca4Encapsulamento
Controle de AcessoSomente Leitura ExternaProtegendo o EstadoInicializadores que Podem FalharRevisão - Conta Bancária7Polimorfismo e Genéricos
PolimorfismoConversão de TiposFunções GenéricasTipos GenéricosRevisão - Calculadora de Formas2Structs e Tipos de Valor
StructsSemântica de ValorMétodos MutáveisStruct ou ClasseRecapitulação - Item de Inventário5Herança
SubclassesSobrescrita de métodosInicializadores e superfinal e hierarquiasRecapitulação - Hierarquia de funcionários8Protocolos Padrão
CustomStringConvertibleEquatableComparableHashableRecapitulação - Ordenação Personalizada11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Swift