La propriété paresseuse readonly de swift

en jouant un peu avec Swift j'ai essayé d'écrire une propriété initialisée en lecture seule et paresseuse. J'ai rapidement écrit cette ligne de code juste d'apprendre qu'il n'est pas permis.

// no valid Swift code.
lazy let foo : Int = { return 42 }()

Vous devez déclarer paresseux propriétés var. Le livre swift indique clairement que laisser avec paresseux n'est pas possible pour une bonne raison:

" vous devez toujours déclarer une propriété paresseuse comme une variable( avec le mot-clé var), parce que sa valeur initiale pourrait ne pas être retrouvée jusqu'à ce que l'initialisation de l'instance suivante soit terminée. Propriétés constantes doit toujours avoir une valeur avant l'initialisation est terminée et ne peut donc pas être déclarée paresseuse."

supposons que j'aimerais avoir une propriété facilement paresseuse à swift. Quelle est la meilleure façon d'archiver ça?

18
demandé sur MBulli 2014-09-26 01:09:16

3 réponses

si readonly et private sont synonymes pour vous dans ce cas précis, alors vous pouvez rendre le setter privé en le déclarant explicitement:

private(set) lazy var foo : Int = { return 42 }()

C'est un bon compromis entre immutabilité et paresse.

34
répondu Antonio 2014-09-25 21:28:38

Vous pouvez également utiliser une variable de sauvegarde privée qui initialise par la suite:

var foo : Int { return _foo }
private lazy var _foo :Int = { return 42 }()
6
répondu David Berry 2014-09-26 02:02:09

il est possible de faire cela avec une propriété calculée et une structure privée. Il n'y a pas besoin du mot-clé lazy sur la valeur var statique, car lui attribuer le résultat d'un bloc est implicitement lazy.

var foo: Int {
    struct Holder {
        static var value = { return 42 }()
    }
    return Holder.value
}
2
répondu kevin 2016-11-16 00:48:00