Menu
Coddy logo textTech

Klasy są referencjami

Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 5 z 57.

Klasa jest typem referencyjnym: zmienna przechowuje referencję do obiektu, a nie jego kopię. Przypisanie instancji do innej zmiennej daje drugą nazwę tego samego obiektu:

class Wallet {
    var coins = 10
}

let mine = Wallet()
let alias = mine
alias.coins = 25
print(mine.coins)

Wynik:

25

=== sprawdza, czy dwa odwołania wskazują tę samą instancję. Dwie osobne instancje to różne obiekty, nawet jeśli wszystkie ich właściwości są takie same:

class Wallet {
    var coins = 10
}

let a = Wallet()
let b = a
let c = Wallet()
print(a === b)
print(a === c)

Wynik:

true
false

Funkcja, która otrzymuje instancję, działa na obiekcie wywołującego, więc zmiany wprowadzone wewnątrz funkcji pozostają widoczne później:

class Wallet {
    var coins = 10
}

func payFee(_ wallet: Wallet) {
    wallet.coins -= 3
}

let w = Wallet()
payFee(w)
payFee(w)
print(w.coins)

Wynik:

4

let ustala referencję, a nie obiekt. Stała przechowująca instancję klasy nie może wskazywać na inną instancję, ale właściwości var tej instancji nadal mogą się zmieniać. Tablice instancji również przechowują referencje:

class Wallet {
    var coins = 10
}

let shared = Wallet()
let team = [shared, shared]
team[0].coins = 99
print(shared.coins)
print(team[1].coins)

Wynik:

99
99
challenge icon

Wyzwanie

Łatwy

Drużyna współdzieli jeden Budget. Uzupełnij spend(_:amount:) — funkcję, która przyjmuje budżet i odejmuje kwotę tylko wtedy, gdy pozostało wystarczająco dużo środków, zwracając true, gdy wydatek był dozwolony. Następnie uzupełnij runTeam(start:purchases:): utwórz jeden budżet, pozwól, aby każdy zakup obciążał ten sam budżet, i zwróć po jednym wierszu na każdy zakup (ok 30 lub denied 80), a następnie left 20.

Dostarczony kod odczytuje budżet początkowy i zakupy z wiersza, w którym wartości rozdzielono przecinkami, a następnie wypisuje każdy zwrócony wiersz.

Umieść swój kod w plikach Budget.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 purchases = input[1].split(separator: ",").map { Int($0)! }
for line in runTeam(start: Int(input[0])!, purchases: purchases) { print(line) }
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Edytor online Swift