swift

Lazy property (proprietà pigra) è una proprietà che assume il valore solo dopo che la classe o la struttura sono stati inizializzati. Viene definita anteponendo alla parola chiave var la parola lazy. La prima precisazione da fare è che soltanto una variabile può essere dichiarata lazy, non una costante; questo è dovuto dal fatto che il valore della costante deve essere noto da subito.

Le lazy properties possono essere utili tutte le volte che il valore della proprietà è determinato da fattori esterni che possono o non possono accadere, di conseguenza la proprietà viene creata solo quando ce nè bisogno. 

Le property observers sono funzioni che venogno eseguite al variare di una proprietà, da qui il nome di osservatori di proprietà. Queste funzioni vengono chiamate tutte le volte che una proprietà viene impostata, anche se non si modifica il valore. Le parole chiave da utilizzare sono: willSet che viene chiamata prima che il nuovo valore sia impostato nella proprietà; didSet chiamata subito dopo aver impostato il nuovo valore alla proprietà.

class NuovoPercorso {

    var distanza: Int = 0 {

        didSet {

            if distanza > oldValue {

                print(distanza - oldValue)

            }

        }

    }

}

let percorsoDiProva = NuovoPercorso()

percorsoDiProva.distanza = 15 //Viene stampato il valore 15

Viene definita la classe NuovoPercorso con una store property distanza con valore iniziale 0. Dopo aver inizializzato la classe vado a inserire un nuovo valore per la proprietà distanza pari a 15. Essendo questo valore maggiore del precedente viene eseguita la stampa della differenza.

Il parametro oldValue viene inserito dal compilatore automaticamente ed è il valore della proprietà prima di acquisire il nuovo valore.

Le type properties sono proprietà "saldate" al tipo e non modificabili da istanze del tipo. Equivale a definire una variabile static in linguaggi come il C. Il manuale Swift 3 riporta un esempio molto valido; abbiamo un v-meter con due canali audio:

v meter 

Questo v-meter viene rappresentato da due istanze della seguente struttura:

struct CanaleAudio {

    static let livelloMassimo = 10

    static var massimoLivelloComplessivo = 0

    

    var livelloCorrente: Int = 0 {

        

        didSet {

            

            if livelloCorrente > CanaleAudio.livelloMassimo {

                livelloCorrente = CanaleAudio.livelloMassimo

            }

            

            if livelloCorrente > CanaleAudio.massimoLivelloComplessivo {

                CanaleAudio.massimoLivelloComplessivo = livelloCorrente

            }

        }

    }

}

var canaleSinistro = CanaleAudio()

var canaleDestro = CanaleAudio()

I due canali condividono lo stesso livello massimo ed il livello massimo raggiunto da uno dei due. Per quanto si creino due istanze canaleSinistro e canaleDestro che indipendentemente visualizzano il livello corrente del segnale, livelloMassimo e massimoLivelloComplessivo sono informazioni condivise da entrambi i canali, per questo vengono definite static e prendono il nome di type property (proprietà del tipo).

Le type properties non sono modificabili da istanze della struttura, non posso scrivere:

canaleSinistro.massimoLivelloComplessivo = 5

Il compilatore restituisce un errore indicando che la proprietà statica non può essere modificata da un'istanza.

Nell'esempio esposto massimoLivelloComplessivo viene modificato dall'observer (didSet) a condizione che il segnale corrente sia maggiore del massimoLivelloComplessivo precedente.

Riassumendo le proprietà statiche (o di tipo) sono utili in quanto non modificabili dalle istanze di conseguenza possono veicolare delle informazioni tra un'istanza e l'altra.