Могу ли я установить вычисляемое свойство в блоке get в Swift? - PullRequest
1 голос
/ 06 января 2020
var myProperty: PropertyType {
 get {
     if let alreadyComupted = savedValue {
       return alreadyComputed
     }
    return computeAndSave(someParam: "Hello")
 }
 set {
// is it possible to move *computeAndSave* body here somehow so I can call *set* method in above get definition?
 }
}

private var savedValue: PropertyType?
private func computeAndSave(someParam: SomeType) -> PropertyType {
// perform computations and assign value to *savedValue*
}

Я довольно новичок в языке swift, но не уверен, является ли это стандартным для практики кодирования или нет.

1 Ответ

0 голосов
/ 06 января 2020

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

lazy var myProperty: PropertyType = {
    let p = // perform some expensive one-time calculation here
    return p
}()

В результате first раз, когда вы запрашиваете значение myProperty, метод инициализатора запускается; но после этого используется предыдущий результат, и метод инициализатора больше никогда не запускается.

...