Menu
Coddy logo textTech

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
99

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

99

Przekazanie 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
5

Tablice 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
50
challenge icon

Wyzwanie

Łatwy

Uzupeł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)")
}
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