2016-01-07 15 views
24

Ho appena notato che i membri static di Swift structs sono implicitamente lazy.Membri static staticamente pigri in Swift

Per esempio, questo sarà solo chiamare la init volta:

class Baz { 
    init(){ 
     print("initializing a Baz") 
    } 
} 
struct Foo { 
    static let bar = Baz() 
} 

var z = Foo.bar 
z = Foo.bar 

Qual è la logica dietro questo?

E se volessi il comportamento contrario?

+5

C'è qualche logica per la scelta di variabili globali che sono pigre qui: https://developer.apple.com/swift/blog/?id=7. I membri statici presumibilmente avrebbero una logica simile, eccetto ancora meno ragioni per l'inizializzazione all'avvio (cioè, se non si fosse mai nemmeno usato un tipo, è stato appena introdotto tramite un'importazione? Tutte le variabili statiche potrebbero essere inizializzate indipendentemente dall'uso ?) –

risposta

39

La proprietà static definisce una "proprietà tipo", una che viene creata un'istanza una volta e una sola volta. Come noti, ciò accade pigramente, poiché le statistiche si comportano come i globali. E come The Swift Programming Language: Properties dice:

costanti globali e le variabili sono sempre calcolati pigramente, in un modo simile a Lazy Stored Properties. A differenza delle proprietà lazy memorizzate, le costanti e le variabili globali non devono essere contrassegnate con il modificatore lazy.

Questo comportamento implicitamente pigro è perché, come il Swift Blog: Files and Initialization dice:

Permette inizializzatori personalizzati, il tempo di avvio a Swift Bilance in modo pulito, senza inizializzatori globali per rallentarlo, e l'ordine di esecuzione è completamente prevedibile.

Hanno progettato consapevolmente in questo modo per evitare ritardi inutili all'avvio dell'app.

Se si desidera creare un'istanza alla proprietà static ad un certo punto particolare nella vostra app (piuttosto che rinviare a dove è prima utilizzata), semplicemente riferimento a questa proprietà static a quel punto in precedenza e l'oggetto verrà inizializzato in quel momento. Considerati gli sforzi che abbiamo compiuto per ridurre la latenza nell'avvio delle nostre app, in genere non lo vorremmo sincronicamente durante il lancio iniziale dell'app, ma puoi farlo ovunque tu voglia.

+0

Nell'esempio "static let cache = NSCache()", la cache è inizializzata all'avvio o, solo quando "la cache viene utilizzata per la prima volta" ...? – Fattie

+0

È pigro. Ho aggiornato la mia risposta per chiarire questo punto. – Rob