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.0Ponieważ 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 LovelaceWł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.0Uż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
}
}Wyzwanie
ŁatwyUzupeł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)
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ążek3Właściwości w szczegółach
Właściwości obliczaneObserwatory właściwościElementy statyczneTypy wyliczeniowe z metodamiPodsumowanie – rejestr temperaturyPoćwicz samodzielnie: Edytor online Swift