Equatable
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 38 di 57.
Equatable fornisce a un tipo gli operatori == e !=. Per le strutture e le enumerazioni le cui proprietà sono tutte Equatable, è sufficiente dichiarare la conformità e Swift confronta ogni proprietà:
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"))Output:
true
truePer confrontare solo alcune proprietà, scrivi tu static func ==. In questo caso, due utenti sono uguali quando i loro ID corrispondono, indipendentemente dai loro nomi:
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"))Output:
true
falseEquatable sblocca metodi standard che richiedono confronti, come contains(_:), firstIndex(of:) e == sugli array interi:
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)])Output:
true
1
trueLe classi non ottengono == gratuitamente: confrontano l’identità con ===. Una classe che deve confrontare i valori deve implementare essa stessa ==:
class Color: Equatable {
let hex: String
init(hex: String) { self.hex = hex }
static func == (lhs: Color, rhs: Color) -> Bool { lhs.hex == rhs.hex }
}Sfida
FacileProduct ha sku, name e price. Due prodotti sono uguali quando il loro sku corrisponde, indipendentemente dagli altri campi. Fai conformare Product a Equatable con un == personalizzato, poi completa mergeCatalog(_:), che mantiene la prima occorrenza di ogni prodotto (usando contains) e restituisce righe sku name price seguite da removed: 2.
Il codice fornito legge i prodotti come righe sku,name,price e stampa ogni riga restituita.
Il tuo codice va in Product.swift e Functions.swift. main.swift contiene il codice fornito per l'input/output e non può essere modificato.
Provalo tu
// Codice di input/output fornito: lascialo così com'è
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) }
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiMetodi e selfInizializzatoriLe classi sono riferimentiRiepilogo - Tessera della biblioteca4Incapsulamento
Controllo degli accessiSola lettura dall’esternoProteggere lo statoInizializzatori che possono fallireRiepilogo - Conto bancario7Polimorfismo e tipi generici
PolimorfismoCasting dei tipiFunzioni genericheTipi genericiRipasso - Calcolatore di forme2Struct e tipi valore
Le structSemantica dei valoriMetodi mutantiStruct o classeRiepilogo - Articolo di inventario5Ereditarietà
SottoclassiSovrascrivere i metodiInizializzatori e superfinal e gerarchieRiepilogo - Gerarchia dei dipendenti8Protocolli standard
CustomStringConvertibleEquatableComparableHashableRiepilogo - Ordinamento personalizzato11Progetto: Gestione della biblioteca
Libri e utentiPrestito dei libriEsercitati da solo: Playground Swift