Equatable
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 38 von 57.
Equatable gibt einem Typ die Operatoren == und !=. Für Strukturen und Enumerationen, deren Eigenschaften alle Equatable sind, genügt es, die Konformität zu deklarieren, und Swift vergleicht jede Eigenschaft:
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"))Ausgabe:
true
trueUm nur einige Eigenschaften zu vergleichen, schreibe static func == selbst. Hier sind zwei Benutzer gleich, wenn ihre IDs übereinstimmen, unabhängig von ihren Namen:
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"))Ausgabe:
true
falseEquatable schaltet Standardmethoden frei, die einen Vergleich benötigen, wie contains(_:), firstIndex(of:) und == für ganze Arrays:
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)])Ausgabe:
true
1
trueKlassen erhalten == nicht automatisch: Sie vergleichen die Identität mit ===. Eine Klasse, die nach ihrem Wert verglichen werden soll, muss == selbst implementieren:
class Color: Equatable {
let hex: String
init(hex: String) { self.hex = hex }
static func == (lhs: Color, rhs: Color) -> Bool { lhs.hex == rhs.hex }
}Aufgabe
EinfachProduct enthält sku, name und price. Zwei Produkte sind identisch, wenn ihre sku übereinstimmt, unabhängig davon, was die anderen Felder enthalten. Sorge dafür, dass Product mit einem benutzerdefinierten == Equatable entspricht, und vervollständige anschließend mergeCatalog(_:), das das erste Vorkommen jedes Produkts beibehält (unter Verwendung von contains) und Zeilen im Format sku name price gefolgt von removed: 2 zurückgibt.
Der bereitgestellte Code liest Produkte als Zeilen im Format sku,name,price ein und gibt jede zurückgegebene Zeile aus.
Dein Code gehört in Product.swift und Functions.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
// Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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) }
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenMethoden und selfInitialisiererKlassen sind ReferenzenRückblick – Bibliotheksausweis4Kapselung
ZugriffskontrolleVon außen schreibgeschütztZustand schützenFehlschlagende InitialisiererRückblick – Bankkonto7Polymorphismus und Generika
PolymorphismusTypumwandlungGenerische FunktionenGenerische TypenZusammenfassung – Shape-Rechner2Strukturen und Werttypen
StrukturenWertsemantikVerändernde MethodenStruktur oder KlasseZusammenfassung – Inventarelement5Vererbung
UnterklassenMethoden überschreibenInitialisierer und superfinal und HierarchienRückblick – Mitarbeiterhierarchie8Standardprotokolle
CustomStringConvertibleEquatableComparableHashableRückblick – Benutzerdefiniertes Sortieren11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Swift-Playground