Подтвердить что ты не робот

Ленивая недвижимость только для чтения в Swift

Немного поиграв со Swift, я попытался написать свойство readonly и lazy initialized. Я быстро написал эту строку кода, чтобы узнать, что это не разрешено.

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

Вы должны объявить ленивые свойства как var. В быстрой книге четко сказано, что пускать с ленивым нельзя по уважительной причине:

"Вы всегда должны объявлять свойство lazy как переменную (с ключевым словом var), потому что его начальное значение не может быть получено до завершения инициализации экземпляра. Свойства константы всегда должны иметь значение до завершения инициализации, и поэтому не могут быть объявлены как lazy ".

Предположим, я хотел бы иметь свойство readonly lazy в swift. Какой лучший способ архивировать это?

4b9b3361

Ответ 1

Если readonly и private являются синонимами для вас в этом конкретном случае, вы можете сделать setter private, явно объявив его:

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

Это хороший компромисс между неизменностью и лень.

Ответ 2

Вы также можете использовать личную резервную переменную, которая инициализируется лениво:

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

Ответ 3

Его можно сделать с помощью вычисленного свойства и частной структуры. Нет необходимости в ленивом ключевом слове для статического значения var, поскольку присвоение ему результата блока подразумевает ленивый.

var foo: Int {
    struct Holder {
        static var value = { return 42 }()
    }
    return Holder.value
}