Ya no necesitas investigar más por internet porque llegaste al sitio exacto, contamos con la respuesta que deseas y sin complicaciones.
Solución:
Bien, esta es una pregunta interesante y no quiero dar a entender que las respuestas existentes no sean buenas, pero pensé en ofrecer mi opinión sobre las cosas.
lazy
Las variables son excelentes para las cosas que deben configurarse una vez y nunca volver a configurarse. Es una variable, por lo que podría cambiarla para que sea otra cosa, pero eso anula el propósito de una lazy
variable (que se montará a demanda).
Los opcionales son más para cosas que podrían desaparecer (y podrían volver a aparecer). Deben configurarse cada vez.
Entonces, veamos dos escenarios para su menú lateral: uno donde permanece mientras no está visible y otro cuando está desasignado.
lazy var sideMenu = SideMenu()
Así que la primera vez que sideMenu
se accede a la propiedad, SideMenu()
se llama y se asigna a la propiedad. La instancia permanece para siempre, incluso cuando no la estás usando.
Ahora veamos otro enfoque.
var _sideMenu: SideMenu?
var sideMenu: SideMenu!
get
if let sm = _sideMenu
return sm
else
let sm = SideMenu()
_sideMenu = sm
return sm
set(newValue)
_sideMenu = newValue
(Tenga en cuenta que esto solo funciona para clases, no para estructuras).
Bien, entonces, ¿qué hace esto? Bueno, se comporta de manera muy similar a la lazy
var, pero te permite volver a configurarlo en nil
. Así que si intentas acceder sideMenu
, tiene la garantía de obtener una instancia (ya sea la que se almacenó en _sideMenu
o uno nuevo). Este es un patrón similar en el sentido de que carga perezosamente SideMenu()
pero este puede crear muchos SideMenu()
instancias, donde el ejemplo anterior solo puede crear uno una vez.
Ahora, la mayoría de los controladores de vista son lo suficientemente pequeños como para que probablemente deba usar lazy
de antes
Así que dos enfoques diferentes para el mismo problema. Ambos tienen ventajas y desventajas, y funcionan mejor o peor en diferentes situaciones.
En realidad son bastante diferentes.
Optional
significa que el valor podría ser nulo y el usuario no garantiza que no lo será. En tu ejemplo, var menu: NavigationBar?
podría ser nulo durante toda la vida útil de la clase, a menos que algo lo asigne explícitamente.
Lazy
por otro lado, significa que la asignación no se llamará hasta que se acceda por primera vez, lo que significa que en algún lugar del código alguien intenta usar su objeto. Sin embargo, tenga en cuenta que TODAVÍA se promete que no será nulo si lo declara como lo ha hecho aquí lazy var menu: NavigationBar = NavigationBar.initialize()
, por lo que no es necesario realizar un encadenamiento opcional.
Y en realidad, una variable puede ser AMBAS Lazy
Y Optional
, lo que significa que su valor se cargará cuando se acceda por primera vez, y ese valor podría ser nulo en el punto en que se inicializa o en cualquier punto futuro. Por ejemplo:
lazy var menu: NavigationBar? = NavigationBar.initialize()
Ese NavigationBar.initialize()
ahora se le permite devolver cero, o alguien en el futuro podría establecer el menu
ser nulo sin que el compilador/tiempo de ejecución arroje errores!
¿Aclara eso la diferencia?
Editar: en cuanto a cuál es MEJOR, eso es realmente una cuestión de caso por caso. Lazy
Las variables tienen un impacto en el rendimiento en la primera inicialización, por lo que el primer acceso será lento si el proceso de inicialización es largo. De lo contrario, son casi idénticos en términos de seguridad/rendimiento. Optional
variables que debe desenvolver antes de usar, por lo que hay un costo de rendimiento muy pequeño con eso (una instrucción de máquina, no vale la pena pensar en ello)
Tienes la opción de añadir valor a nuestro contenido informacional cooperando tu experiencia en las referencias.