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
falseFunkcja, 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:
4let 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
99Wyzwanie
ŁatwyDruż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) }
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