Esistono sostanzialmente due tipi di proprietà: stored e computed.
La differenza sostanziale è che le stored properties associano valori (costanti o variabili) all’istanza di una classe mentre le computed properties non hanno valore associato ma questo viene calcolato al momento necessario.
Un’altra differenza consiste nel fatto che le Computed Properties sono disponibili in classi, strutture e enumerazioni, mentre le Stored Properties solo all’interno di classi e strutture.
Stored Properties
Un semplice esempio di una classe cerchio:
1 2 3 4 5 6 7 |
class Cerchio { var raggio: Double = 0 init() {} } |
La classe cerchio ha una variabile di istanza chiamata
raggio con valore predefinito uguale a 0. In Swift, ogni variabile di istanza è automaticamente una proprietà (molto comodo).
Per ogni variabile di istanza (e quindi per ogni stored property) è possibile aggiungere cosiddetti property observers. In Swift ci sono due tipi di property observers: uno invocato prima che il nuovo valore sia assegnato e l’altro dopo che il nuovo valore è stato assegnato.
Il property observer che viene chiamato prima dell’assegnazione viene contrassegnato con la parola chiave willSet .
1 2 3 4 5 6 7 8 9 10 11 |
class Cerchio { var raggio: Double = 0 { willSet { print("Sarà assegnato il nuovo valore (newValue)") } } init() {} } |
E’ possibile accedere al valore che sta per essere assegnato con la variabile newValue .
Il property observer che viene chiamato dopo l’assegnazione viene contrassegnato con la parola chiave didSet .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Cerchio { var raggio: Double = 0 { willSet { print("Sarà assegnato il nuovo valore (newValue)") } didSet { if raggio < 0 { raggio = oldValue } } } init() {} } |
E’ possibile accedere al vecchio valore della proprietà tramite la variabile oldValue .
Computed Properties
Le Computed Properties non hanno un valore associato; il valore viene calcolato (computed) ogni volta che vengono chiamate / utilizzate. Utilizzando la classe Cerchio possiamo definire una nuova proprietà area come computed property.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Cerchio { var raggio: Double = 0 var area: Double { get { return raggio * raggio * M_PI } set(newArea) { raggio = sqrt(newArea / M_PI) } } init() {} } |
Per una computed property è obbligatorio definire un get . In assenza di un set la computed property è di tipo read-only.
Lazy Properties
Utilizzando il modificatore lazy il valore di una proprietà viene inizializzato / calcolato solo quando la proprietà viene chiamata per la prima volta. Il modificatore lazy è ovviamente applicabile alle sole stored properties.
- Per maggiori informazioni: Documentazione (Apple)