sport - swift apple
Propiedad perezosa de solo lectura en swift (3)
Mientras jugaba un poco con Swift, intenté escribir una propiedad inicializada de solo lectura y perezosa. Rápidamente escribí esa línea de código solo para saber que no está permitido.
// no valid Swift code.
lazy let foo : Int = { return 42 }()
Tienes que declarar propiedades perezosas como var
. El libro veloz establece claramente que dejar con flojo no es posible por una buena razón:
“Siempre debe declarar una propiedad perezosa como una variable (con la palabra clave var), ya que su valor inicial podría no recuperarse hasta que finalice la inicialización de la instancia. Las propiedades constantes siempre deben tener un valor antes de que se complete la inicialización y, por lo tanto, no se pueden declarar como perezosas ".
Suponiendo que me gustaría tener una propiedad perezosa de sólo lectura en swift. ¿Cuál es la mejor manera de archivar eso?
Es posible hacer esto con una propiedad computada y una estructura privada. No hay necesidad de la palabra clave perezosa en el valor var estático, ya que asignarle el resultado de un bloque es implícitamente perezoso.
var foo: Int {
struct Holder {
static var value = { return 42 }()
}
return Holder.value
}
Si readonly y private son sinónimos para usted en este caso específico, entonces puede hacer que el configurador sea privado declarándolo explícitamente:
private(set) lazy var foo : Int = { return 42 }()
Ese es un buen compromiso entre la inmutabilidad y la pereza.
También puede usar una variable de respaldo privado que se inicializa perezosamente:
var foo : Int { return _foo }
private lazy var _foo :Int = { return 42 }()