Saltar al contenido

Swift Lazy y propiedades opcionales

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *