Storicamente, in Objective-C le proprietà erano implementate tramite metodi di accesso (getter e setter). In Swift è stata introdotta una costruzione sintattica speciale per le proprietà computate, che consente di creare facilmente proprietà che calcolano il loro valore "al volo". Questo amplia le possibilità di incapsulamento e l'espressività del codice dei tipi.
Problema: Non è sempre conveniente memorizzare il risultato come proprietà memorizzata, soprattutto se il valore dipende da altre proprietà o cambia continuamente. L'uso di metodi-calcolatori crea un'interfaccia di tipo meno leggibile, nascondendo la sua natura.
Risposta: Una proprietà computata è definita tramite get e, se necessario, set. Ad ogni accesso a tale proprietà viene effettuato un calcolo, e non una lettura dalla memoria. Questo consente, ad esempio, di costruire proprietà derivate, che sono automaticamente sincronizzate con il resto dello stato dell'oggetto.
Esempio di codice:
struct Rectangle { var width: Double var height: Double var area: Double { get { return width * height } set { // Aggiornamento automatico della larghezza in base al nuovo valore del campo area (esempio) width = sqrt(newValue / height) } } } var rect = Rectangle(width: 5, height: 2) print(rect.area) // 10 rect.area = 36 print(rect.width) // 3.0
Caratteristiche chiave:
È possibile utilizzare willSet/didSet con proprietà computate?
No, willSet e didSet si applicano solo alle proprietà memorizzate. Per le proprietà computate questi osservatori non funzionano, poiché non c'è memorizzazione automatica del valore.
Una proprietà computata può avere un tipo debole o opzionale?
Sì, una proprietà computata può essere opzionale o implicitamente non unwrapped. Tuttavia, non ha senso rendere tali proprietà weak, poiché non contengono un riferimento — solo un calcolo.
In quali casi è meglio utilizzare private set in una proprietà computata?
Il modificatore di accesso private(set) non può essere applicato a una proprietà computata con get e set, solo a proprietà memorizzate. Per una proprietà computata, il set può essere completamente privato usando private set, ma questo è implementato implicitamente attraverso la disponibilità del blocco set.
public var area: Double { private set { ... } get { ... } }
Il getter della proprietà computata esegue un caricamento di grandi dati dalla rete ogni volta che viene accesso, causando freeze e sovraccarico di rete.
Pro:
Contro:
La proprietà computata calcola un valore finale basato su altre proprietà memorizzate con costi minimi, e la logica pesante di caching è delegata a un meccanismo separato.
Pro:
Contro: