Klassen sind Referenzen
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 5 von 57.
Eine Klasse ist ein Referenztyp: Eine Variable enthält eine Referenz auf das Objekt, nicht eine Kopie davon. Wenn du eine Instanz einer anderen Variable zuweist, erhältst du einen zweiten Namen für dasselbe Objekt:
class Wallet {
var coins = 10
}
let mine = Wallet()
let alias = mine
alias.coins = 25
print(mine.coins)Ausgabe:
25=== prüft, ob zwei Referenzen auf dieselbe Instanz verweisen. Zwei separate Instanzen sind unterschiedliche Objekte, selbst wenn alle ihre Eigenschaften übereinstimmen:
class Wallet {
var coins = 10
}
let a = Wallet()
let b = a
let c = Wallet()
print(a === b)
print(a === c)Ausgabe:
true
falseEine Funktion, die eine Instanz empfängt, arbeitet mit dem Objekt des Aufrufers, sodass innerhalb der Funktion vorgenommene Änderungen danach weiterhin sichtbar sind:
class Wallet {
var coins = 10
}
func payFee(_ wallet: Wallet) {
wallet.coins -= 3
}
let w = Wallet()
payFee(w)
payFee(w)
print(w.coins)Ausgabe:
4let fixiert die Referenz, nicht das Objekt. Eine Konstante, die eine Klasseninstanz enthält, kann nicht auf eine andere Instanz verweisen, aber die var-Eigenschaften der Instanz können weiterhin geändert werden. Arrays mit Instanzen enthalten ebenfalls Referenzen:
class Wallet {
var coins = 10
}
let shared = Wallet()
let team = [shared, shared]
team[0].coins = 99
print(shared.coins)
print(team[1].coins)Ausgabe:
99
99Aufgabe
EinfachEin Team teilt sich ein Budget. Vervollständige spend(_:amount:), eine Funktion, die ein Budget entgegennimmt und den Betrag nur dann abzieht, wenn noch genügend übrig ist, und true zurückgibt, wenn die Ausgabe erlaubt war. Vervollständige anschließend runTeam(start:purchases:): Erstelle ein Budget, lasse jeden Einkauf von demselben Budget abziehen und gib für jeden Einkauf eine Zeile zurück (ok 30 oder denied 80), gefolgt von left 20.
Der bereitgestellte Code liest das Anfangsbudget und die Einkäufe als durch Kommas getrennte Zeile ein und gibt jede zurückgegebene Zeile aus.
Dein Code gehört in Budget.swift und Functions.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
// Gelieferter Ein-/Ausgabe-Code: belasse ihn unverändert
var input: [String] = []
while let line = readLine() { input.append(line) }
let purchases = input[1].split(separator: ",").map { Int($0)! }
for line in runTeam(start: Int(input[0])!, purchases: purchases) { 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