Semantyka wartości
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 8 z 57.
Struktury są typami wartości: przypisanie struktury do innej zmiennej kopiuje ją. Zmiana kopii nie wpływa na oryginał, w przeciwieństwie do klasy:
struct Point {
var x: Int
}
var a = Point(x: 1)
var b = a
b.x = 99
print(a.x)
print(b.x)Wynik:
1
99To samo porównanie z klasą pokazuje różnicę: obie zmienne odwołują się do jednego obiektu.
class PointRef {
var x: Int
init(x: Int) { self.x = x }
}
let a = PointRef(x: 1)
let b = a
b.x = 99
print(a.x)Wynik:
99Przekazanie struktury do funkcji również przekazuje jej kopię. Parametr jest stałą, więc aby zwrócić zmienioną wersję, funkcja tworzy lokalną kopię i ją zwraca:
struct Point {
var x: Int
}
func shifted(_ p: Point, by dx: Int) -> Point {
var copy = p
copy.x += dx
return copy
}
let start = Point(x: 1)
let moved = shifted(start, by: 4)
print(start.x)
print(moved.x)Wynik:
1
5Tablice struktur przechowują niezależne wartości. Zmiana elementu za pomocą jego indeksu zmienia tylko ten element, a skopiowanie tablicy kopiuje każdą wartość:
struct Score {
var points: Int
}
var round1 = [Score(points: 1), Score(points: 2)]
var round2 = round1
round2[0].points = 50
print(round1[0].points)
print(round2[0].points)Wynik:
1
50Wyzwanie
ŁatwyUzupełnij tryDiscount(_:percent:). Funkcja otrzymuje strukturę Price i zwraca przecenioną kopię: liczbę centów zmniejszoną o podany procent, zaokrągloną w dół. Dostarczony kod wyświetla pierwotną i przecenioną cenę, więc pierwotna musi pozostać niezmieniona.
Dostarczony kod odczytuje cenę w centach i jeden procent w każdym wierszu, a następnie wyświetla was 1000, now 900 dla każdego z nich.
Twój kod umieść w plikach Price.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 original = Price(cents: Int(input[0])!)
for line in input.dropFirst() {
let cheaper = tryDiscount(original, percent: Int(line)!)
print("was \(original.cents), now \(cheaper.cents)")
}
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