Struktur oder Klasse
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 10 von 57.
Swifts Richtlinie lautet, mit einer Struktur zu beginnen und eine Klasse nur dann zu wählen, wenn du etwas benötigst, das nur Klassen bieten. Strukturen sind einfacher: Jede Variable besitzt ihren eigenen Wert, sodass eine Änderung an einer Stelle den Code an einer anderen Stelle niemals überrascht.
struct Temperature {
var celsius: Double
}
var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)Ausgabe:
21.0Wähle eine Klasse, wenn ein Objekt gemeinsam genutzt werden muss: Mehrere Teile des Programms müssen denselben sich ändernden Zustand sehen, beispielsweise ein Bankkonto, das von mehreren Bildschirmen verwendet wird. Klassen unterstützen außerdem Vererbung, was bei Strukturen nicht der Fall ist.
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)Ausgabe:
2Structs können == kostenlos erhalten. Füge Equatable zur Deklaration hinzu, und Swift vergleicht jede Eigenschaft; Klassen vergleichen stattdessen die Identität mit ===:
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))Ausgabe:
true
falseEine kurze Prüfung: Wenn zwei Elemente mit denselben Daten als dieselbe Sache zählen sollen, verwende eine Struktur (einen Punkt, einen Preis, ein Datum). Wenn ein Element eine Identität hat, die auch dann wichtig ist, wenn seine Daten mit denen eines anderen übereinstimmen (ein Benutzerkonto, eine geöffnete Datei), verwende eine Klasse.
struct Money { var cents: Int } // 500 Cent sind 500 Cent
class UserAccount { // zwei Konten können denselben Namen teilen
let id: Int
var name: String
init(id: Int, name: String) { self.id = id; self.name = name }
}Aufgabe
EinfachPoint ist eine Struktur, die mit == vergleichbar sein sollte. Füge die Konformität hinzu und vervollständige countDistinct(_:), das zurückgibt, wie viele verschiedene Punkte in der Liste enthalten sind (zwei Punkte sind gleich, wenn beide Koordinaten übereinstimmen).
Der bereitgestellte Code liest einen Punkt pro Zeile im Format x,y ein und gibt distinct: zusammen mit der Anzahl aus.
Dein Code gehört in Point.swift und Functions.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
// Gelieferter Ein-/Ausgabe-Code: belasse ihn wie er ist
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))")
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