Struktura czy klasa
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 10 z 57.
Wytyczna w Swift brzmi: zacznij od struktury i wybierz klasę tylko wtedy, gdy potrzebujesz czegoś, co oferują wyłącznie klasy. Struktury są prostsze: każda zmienna ma własną wartość, więc zmiana w jednym miejscu nigdy nie zaskoczy kodu w innym miejscu.
struct Temperature {
var celsius: Double
}
var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)Wynik:
21.0Wybierz klasę, gdy jeden obiekt musi być współdzielony: kilka części programu musi widzieć ten sam zmieniający się stan, na przykład jedno konto bankowe używane przez wiele ekranów. Klasy obsługują też dziedziczenie, którego struktury nie obsługują.
class SharedLog {
var lines: [String] = []
}
let log = SharedLog()
let moduleA = log
let moduleB = log
moduleA.lines.append("A started")
moduleB.lines.append("B started")
print(log.lines.count)Wynik:
2Struktury mogą bezpłatnie obsługiwać operator ==. Dodaj Equatable do deklaracji, a Swift porówna każdą właściwość; klasy porównują tożsamość za pomocą ===:
struct Point: Equatable {
var x: Int
var y: Int
}
print(Point(x: 1, y: 2) == Point(x: 1, y: 2))
print(Point(x: 1, y: 2) == Point(x: 2, y: 1))Wynik:
true
falseSzybki test: jeśli dwa elementy z takimi samymi danymi powinny być uznawane za tę samą rzecz, użyj struktury (punktu, ceny, daty). Jeśli element ma tożsamość, która ma znaczenie nawet wtedy, gdy jego dane są takie same jak dane innego elementu (konto użytkownika, otwarty plik), użyj klasy.
struct Money { var cents: Int } // 500 centów to 500 centów
class UserAccount { // dwa konta mogą mieć tę samą nazwę
let id: Int
var name: String
init(id: Int, name: String) { self.id = id; self.name = name }
}Wyzwanie
ŁatwyPoint to struktura, która powinna być porównywalna za pomocą ==. Dodaj zgodność i uzupełnij countDistinct(_:), która zwraca liczbę różnych punktów na liście (dwa punkty są takie same, gdy obie współrzędne się zgadzają).
Dostarczony kod odczytuje jeden punkt w każdym wierszu w formacie x,y i wypisuje distinct: wraz z liczbą.
Twój kod umieść w plikach Point.swift i Functions.swift. 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 points = input.map { line -> Point in
let p = line.split(separator: ",").map { Int($0)! }
return Point(x: p[0], y: p[1])
}
print("distinct: \(countDistinct(points))")
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