Menu
Coddy logo textTech

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
false

Eine 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:

4

let 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
99
challenge icon

Aufgabe

Einfach

Ein 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) }
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Swift-Playground