Sobes.tech
Junior

O que é lazy?

sobes.tech IA

Resposta da IA

A palavra-chave lazy é usada para inicialização diferida de uma propriedade.

Uma propriedade com lazy é inicializada apenas na primeira vez que é acedida. Isto é útil para:

  • Desempenho: se a criação do objeto requer muitos recursos, mas nem sempre é necessário.
  • Evitar dependências cíclicas durante a inicialização.
  • Trabalhar com recursos externos ou dados que podem não estar disponíveis na criação do objeto.

As propriedades lazy devem ser:

  • Variáveis (var), pois o seu valor pode mudar na primeira acessibilidade.
  • Sem observadores de propriedades (willSet, didSet) até à primeira acessibilidade.
class HeavyResource {
    init() {
        print("Recurso pesado inicializado")
        // Simulação de inicialização dispendiosa
        Thread.sleep(forTimeInterval: 1)
    }
}

class MyPresenter {
    let name = "Presenter"

    // propriedade lazy, inicializa-se na primeira utilização
    lazy var heavyResource: HeavyResource = {
        print("A criar recurso pesado")
        return HeavyResource()
    }()

    init() {
        print("\(name) inicializado")
    }

    func accessResource() {
        print("A aceder ao recurso pesado...")
        _ = heavyResource // Aqui ocorre a inicialização da propriedade lazy
        print("Recurso acedido.")
    }
}

// Inicializar o apresentador
let presenter = MyPresenter() // Saída: Presenter initialized

// O acesso ao recurso ocorre mais tarde, quando realmente necessário
presenter.accessResource()
/*
Saída:
A aceder ao recurso pesado...
A criar recurso pesado
Recurso pesado inicializado
Recurso acedido.
*/

// Acesso repetido não provoca re-inicialização
presenter.accessResource()
/*
Saída:
A aceder ao recurso pesado...
Recurso acedido.
*/