2015-12-23 12 views
9

Ho un immobileSwift può pigri e didSet impostare insieme

public lazy var points: [(CGFloat,CGFloat,CGFloat)] = { 
     var pointsT = [(CGFloat,CGFloat,CGFloat)]() 
     let height = 100.0 
     for _ in 1...10 { 
      pointsT.append((someValue,someValue,100.0)) 
     } 
     return pointsT 
    }() 

e voglio aggiungere un metodo didSet, è possibile?

+0

cosa è 'ar' in' for p in ar'? – dfri

+1

Cambiato, niente a che fare con la domanda in realtà. Grazie. –

risposta

13

Risposta breve: no.

Prova questo semplice esempio, in qualche classe o un metodo di tuo:

lazy var myLazyVar: Int = { 
    return 1 
}() { 
    willSet { 
     print("About to set lazy var!") 
    } 
} 

Questo vi dà il seguente errore di compilazione:

Lazy properties may not have observers.


Per quanto riguarda la dichiarazione let in l'altra risposta: non è necessaria la variabile lazy solo "Consenti costanti con inizializzazione ritardata". Si consideri il seguente esempio:

struct MyStruct { 
    var myInt = 1 

    mutating func increaseMyInt() { 
     myInt += 1 
    } 

    lazy var myLazyVar: Int = { 
     return self.myInt 
    }() 
} 

var a = MyStruct() 
print(a.myLazyVar) // 1 
a.increaseMyInt() 
print(a.myLazyVar) // 1: "initialiser" only called once, OK 
a.myLazyVar += 1 
print(a.myLazyVar) // 2: however we can still mutate the value 
        // directly if we so wishes 
+1

Hai assolutamente ragione, rimuoverò quello dalla mia risposta che quindi fondamentalmente legge "no" :) up you go! – luk2302

2

No

points è una costante, non è possibile impostare qualsiasi cosa ad esso. L'unica differenza con una costante let è che è (potenzialmente) inizializzato in seguito.

This answer fornisce qualche informazione in più sul motivo per cui si utilizza var invece di let nel caso lazy.

Edit: per rendere la risposta non sembra svuotare Date un'occhiata al this blog post dove l'autore solleva alcuni punti validi per quanto riguarda il motivo per cui l'osservazione lazy Vars potrebbe non ancora essere supportate. Cosa dovrebbe essere oldValue nell'osservatore? nil? Non sarebbe una buona idea nel tuo caso non opzionale.

+0

* "L'unica differenza rispetto a una costante costante è che è (potenzialmente) inizializzata più tardi" *, questo non è proprio vero. I lazy vars possono essere usati come 'var': s allo stesso modo, vedi il mio esempio aggiunto. – dfri

+0

Per quanto riguarda la modifica: concordo, buona aggiunta. Inoltre, in un certo punto si era in un certo punto in cui la var lazy * dovrebbe * generalmente comportarsi in modo immutabile dopo l'inizializzazione, poiché generalmente usiamo lazy vars su istanze di classi o strutture (grandi?) Che non cambieranno (anche se i loro membri mutano; ma possiamo avere osservatori separati per questo). Quindi, nel nostro inizializzatore delle variabili lazy abbiamo il nostro 'solo-will-set '(ad esempio print" Will be set! "). Quindi forse Apple intende (per convenzione) che i pigri vars non cambino dopo init, quindi un altro motivo per cui non c'è alcun supporto. osservatori. – dfri

4

La risposta breve è come altri hanno detto è "no", ma c'è un modo per ottenere l'effetto utilizzando un var pigro nascosto interno e calcolato var.

private lazy var _username: String? { 
    return loadUsername() 
} 
var username: String? { 
    set { 
     // Do willSet stuff in here 
     if newValue != _username { 
      saveUsername(newValue) 
     } 
     // Don't forget to set the internal variable 
     _username = newValue 
     // Do didSet stuff here 
     // ... 
    } 
    get { 
     return _username 
    } 
} 
Problemi correlati