Historycznie w Objective-C właściwości były realizowane przez metody dostępu (gettery i settery). W Swift wprowadzono specjalną konstrukcję syntaktyczną dla właściwości obliczonych, co umożliwia łatwe tworzenie właściwości, które obliczają swoją wartość „na bieżąco”. To rozszerza możliwości enkapsulacji i ekspresyjności kodu typów.
Problem: Nie zawsze jest wygodne przechowywać wynik jako właściwość przechowywaną, zwłaszcza jeśli wartość zależy od innych właściwości lub stale się zmienia. Użycie metod-kalkulatorów tworzy mniej czytelny interfejs typu, ukrywając jego naturę.
Rozwiązanie:
Właściwość obliczona jest definiowana za pomocą get i, w razie potrzeby, set. Przy każdym dostępie do takiej właściwości wykonywane jest obliczenie, a nie odczyt z pamięci. To pozwala na przykład na budowanie właściwości pochodnych, które są automatycznie synchronizowane z pozostałym stanem obiektu.
Przykład kodu:
struct Rectangle { var width: Double var height: Double var area: Double { get { return width * height } set { // Automatyczna aktualizacja szerokości dla nowej wartości pola area (przykład) width = sqrt(newValue / height) } } } var rect = Rectangle(width: 5, height: 2) print(rect.area) // 10 rect.area = 36 print(rect.width) // 3.0
Kluczowe cechy:
get lub get i set.Czy można używać willSet/didSet z właściwościami obliczonymi?
Nie, willSet i didSet stosują się tylko do właściwości przechowywanych. Dla właściwości obliczonych ci obserwatorzy nie działają, ponieważ nie ma automatycznego przechowywania wartości.
Czy właściwość obliczona może mieć słaby lub niejawnie rozwinięty typ?
Tak, właściwość obliczona może być opcjonalna lub niejawnie rozwinięta. Jednak nie ma sensu robić takich właściwości weak, ponieważ nie zawierają one odniesienia — tylko obliczenie.
W jakich przypadkach lepiej używać private set w właściwości obliczonej?
Modyfikator dostępu private(set) nie może być stosowany do właściwości obliczonej z get i set, tylko do właściwości przechowywanych. Dla właściwości obliczonej set może być całkowicie prywatny przy użyciu private set, ale realizowane jest to niejawnie przez dostępność bloku set.
public var area: Double { private set { ... } get { ... } }
get, co prowadzi do słabej wydajności.set, gdy zmiana jednej właściwości powinna wpływać na kilka innych.Getter właściwości obliczonej wykonuje ładowanie dużych danych z sieci za każdym razem, gdy jest dostępny, co prowadzi do zacinania się i obciążenia sieci.
Zalety:
Wady:
Właściwość obliczona oblicza ostateczną wartość na podstawie innych właściwości przechowywanych z minimalnymi kosztami, a mechanizm cache'owania ciężkiej logiki został przeniesiony do osobnego mechanizmu.
Zalety:
Wady: