lazy - singleton swift 3
Miembros estáticos implícitamente perezosos en Swift (1)
Me acabo de dar cuenta de que static
miembros static
de las structs
de Swift son implícitamente lazy
.
Por ejemplo, esto solo llamará al init
una vez:
class Baz {
init(){
print("initializing a Baz")
}
}
struct Foo {
static let bar = Baz()
}
var z = Foo.bar
z = Foo.bar
¿Cuál es la razón detrás de esto?
¿Qué pasa si quiero el comportamiento opuesto?
La propiedad static
define una "propiedad de tipo", una que se instancia una vez y solo una vez. Como nota, esto sucede perezosamente, ya que la estática se comporta como globales. Y como dice The Swift Programming Language: Properties, dice:
Las constantes y variables globales siempre se calculan de forma perezosa, de forma similar a las propiedades almacenadas diferidas . A diferencia de las propiedades almacenadas perezosas, las constantes globales y las variables no necesitan marcarse con el modificador
lazy
.
Este comportamiento implícitamente perezoso se debe a que, como dice el developer.apple.com/swift/blog/?id=7 :
permite inicializar de forma personalizada los inicializadores, el tiempo de inicio en las escalas de Swift sin inicializadores globales para ralentizarlo, y el orden de ejecución es completamente predecible.
Ellos conscientemente lo diseñaron de esa manera para evitar retrasar innecesariamente el inicio de la aplicación.
Si desea crear una instancia de la propiedad static
en algún punto particular de su aplicación (en lugar de diferirla a donde se usó por primera vez), simplemente haga referencia a esta propiedad static
en ese punto anterior y el objeto se inicializará en ese momento. Teniendo en cuenta los esfuerzos que ponemos en la reducción de la latencia al iniciar nuestras aplicaciones, generalmente no querrá esto sincrónicamente durante el lanzamiento inicial de la aplicación, pero puede hacerlo donde quiera.