2014-10-19 8 views
17

I lazy vars in Swift vengono calcolati più di una volta? Ho avuto l'impressione che abbiano sostituito il:I lazy vars in Swift vengono calcolati più di una volta?

if (instanceVariable) { 
    return instanceVariable; 
} 

// set up variable that has not been initialized 

Paradigma da Objective-C (lanciando l'istanza).

È quello che fanno? Fondamentalmente chiamato solo una volta la prima volta che l'app chiede la variabile, quindi restituisce solo ciò che è stato calcolato?

Oppure viene chiamato ogni volta come una normale proprietà calcolata?

Il motivo che chiedo è perché fondamentalmente voglio una proprietà calcolata in Swift che possa accedere ad altre variabili di istanza. Dire che ho una variabile chiamata "fullName" e si concatena solo firstName e lastName. Come lo farei in Swift? Sembra che le lazy vars siano l'unica strada da percorrere, dato che nei normali vali calcolati (non pigri) non riesco ad accedere ad altre variabili di istanza.

Quindi, fondamentalmente:

fare Vars pigri a Swift ottenere chiamato più di una volta? In tal caso, come posso creare una variabile calcolata in grado di accedere alle variabili di istanza? In caso contrario, se desidero che una variabile venga calcolata una sola volta per motivi di prestazioni, come posso fare?

risposta

3

No, le proprietà lazy vengono inizializzate solo una volta. Se si imposta un nuovo valore o si ripristina su nil (per proprietà facoltative), l'inizializzatore pigro è non richiamato di nuovo.

Penso che ciò che serve sia una proprietà calcolata - non è supportata da una proprietà memorizzata, quindi non è coinvolta nell'inizializzazione e in quanto tale è possibile fare riferimento ad altre proprietà di istanza.

Perché si dice che "normale comput vars (non pigro) non riesco ad accedere ad altre variabili di istanza"?

+0

1. Che cosa si intende se una proprietà calcolata non è supportata da una proprietà memorizzata? FullName non è supportato da firstName, lastName? 2. Oltre a diventare pigri una volta intiailizzati, è la differenza maggiore tra i due che: per pigro se si imposta * il lazyFullName allora si imposta semplicemente ... ma per il computedLazyFullName se lo si imposta allora è necessario un qualche meccanismo per aggiornare le proprietà firstName, lastName * memorizzate *? – Honey

16

lazy var s vengono calcolati solo una volta, la prima volta che li si utilizza. Dopo di ciò, sono proprio come una variabile normale.

Questo è facile da testare in un parco giochi:

class LazyExample { 
    var firstName = "John" 
    var lastName = "Smith" 
    lazy var lazyFullName : String = { 
     [unowned self] in 
     return "\(self.firstName) \(self.lastName)" 
    }() 
} 

let lazyInstance = LazyExample() 

println(lazyInstance.lazyFullName) 
// John Smith 

lazyInstance.firstName = "Jane" 

println(lazyInstance.lazyFullName) 
// John Smith 

lazyInstance.lazyFullName = "???" 

println(lazyInstance.lazyFullName) 
// ??? 

Se si vorrà ricalcolare in un secondo momento, utilizzare una proprietà computerizzata (con una variabile di supporto, se è costoso) - proprio come avete fatto in Objective-C.

+0

non c'è niente che non va con il tuo codice ... ma è potenzialmente fuorviante, cioè se cambi la modifica "firstName" in "Jane" ** prima di accedere a ** "lazyFullName", allora stampa "Jane Smith" – Honey

Problemi correlati