Equatable
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 38 z 57.
Equatable udostępnia typowi operatory == i !=. W przypadku struktur i wyliczeń, których wszystkie właściwości są zgodne z Equatable, wystarczy zadeklarować zgodność, a Swift porówna każdą właściwość:
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"))Wynik:
true
trueAby porównywać tylko niektóre właściwości, napisz samodzielnie static func ==. Tutaj dwóch użytkowników jest równych, gdy ich identyfikatory są takie same, niezależnie od ich imion:
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"))Wynik:
true
falseEquatable udostępnia standardowe metody wymagające porównywania, takie jak contains(_:), firstIndex(of:) i == dla całych tablic:
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)])Wynik:
true
1
trueKlasy nie dostają == za darmo: porównują tożsamość za pomocą ===. Klasa, która powinna być porównywana według wartości, musi samodzielnie zaimplementować ==:
class Color: Equatable {
let hex: String
init(hex: String) { self.hex = hex }
static func == (lhs: Color, rhs: Color) -> Bool { lhs.hex == rhs.hex }
}Wyzwanie
ŁatwyProduct ma pola sku, name i price. Dwa produkty są takie same, gdy ich sku są zgodne, niezależnie od wartości pozostałych pól. Spraw, aby Product spełniał protokół Equatable z własną implementacją ==, a następnie uzupełnij mergeCatalog(_:), która zachowuje pierwsze wystąpienie każdego produktu (używając contains) i zwraca wiersze w formacie sku name price, po których następuje removed: 2.
Dostarczony kod wczytuje produkty jako wiersze w formacie sku,name,price i wypisuje każdy zwrócony wiersz.
Twój kod umieść w plikach Product.swift i Functions.swift. Plik main.swift zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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) }
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasMetody i selfInicjalizatoryKlasy są referencjamiPowtórzenie — karta biblioteczna4Hermetyzacja
Kontrola dostępuTylko do odczytu z zewnątrzOchrona stanuInicjalizatory, które mogą zawieśćPodsumowanie — konto bankowe7Polimorfizm i typy generyczne
PolimorfizmRzutowanie typówFunkcje generyczneTypy generycznePodsumowanie – kalkulator kształtów2Struktury i typy wartościowe
StrukturySemantyka wartościMetody modyfikująceStruktura czy klasaPodsumowanie – element inwentarza5Dziedziczenie
PodklasyPrzesłanianie metodInicjalizatory i superfinal i hierarchiePodsumowanie — hierarchia pracowników8Standardowe protokoły
CustomStringConvertibleEquatableComparableHashablePodsumowanie — własne sortowanie11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Swift