Menu
Coddy logo textTech

Właściwości obliczane

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

Właściwość przechowywana przechowuje wartość. Właściwość obliczana nie przechowuje wartości: za każdym razem, gdy jest odczytywana, wykonuje kod i zwraca wartość obliczoną na podstawie innych właściwości:

struct Rectangle {
    var width: Double
    var height: Double

    var area: Double {
        width * height
    }
}

var r = Rectangle(width: 3, height: 4)
print(r.area)
r.width = 10
print(r.area)

Wynik:

12.0
40.0

Ponieważ wartość jest przeliczana przy każdym odczycie, właściwość obliczana nigdy nie może być nieaktualna. Odczytuje się ją tak jak właściwość przechowywaną, bez nawiasów:

struct Person {
    var first: String
    var last: String

    var fullName: String {
        "\(first) \(last)"
    }
}

var p = Person(first: "Ada", last: "Byron")
p.last = "Lovelace"
print(p.fullName)

Wynik:

Ada Lovelace

Właściwość obliczeniowa może mieć również setter. set otrzymuje nową wartość jako newValue i aktualizuje przechowywane właściwości, na których bazuje:

struct Temperature {
    var celsius: Double

    var fahrenheit: Double {
        get { celsius * 9 / 5 + 32 }
        set { celsius = (newValue - 32) * 5 / 9 }
    }
}

var t = Temperature(celsius: 100)
print(t.fahrenheit)
t.fahrenheit = 32
print(t.celsius)

Wynik:

212.0
0.0

Użyj właściwości obliczanej dla wartości, która wynika z innych wartości i jest tania do obliczenia. Użyj metody, gdy praca wymaga argumentów lub jest kosztowna:

struct Order {
    var items: [Int]
    var total: Int { items.reduce(0, +) }           // właściwość: bez argumentów
    func total(withTax rate: Int) -> Int {           // metoda: przyjmuje argument
        total + total * rate / 100
    }
}
challenge icon

Wyzwanie

Łatwy

Uzupełnij strukturę Circle o przechowywaną właściwość radius i trzy tylko do odczytu właściwości obliczane: diameter (dwukrotność promienia), area (π r², z użyciem Double.pi) oraz label, która zwraca r=2.0 d=4.0 a=12.57 z polem zaokrąglonym do dwóch miejsc po przecinku przy użyciu String(format: "%.2f", area).

Udostępniony kod odczytuje jeden promień w każdym wierszu, tworzy Circle i wypisuje label. Następnie podwaja promień ostatniego okręgu i ponownie wypisuje jego label, dlatego wartości muszą być zgodne z promieniem.

Umieść swój kod w pliku Circle.swift. Plik main.swift zawiera udostępniony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

import Foundation

// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
var input: [String] = []
while let line = readLine() { input.append(line) }
var last = Circle(radius: 0)
for line in input {
    last = Circle(radius: Double(line)!)
    print(last.label)
}
last.radius *= 2
print(last.label)
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