Разница между вычисляемым свойством и набором свойств с замыканием

Я новичок в Swift. В чем разница между вычисляемым свойством и свойством, установленным на закрытие? Я знаю, что вычисляемое свойство пересчитывается каждый раз. Это отличается для закрытия? т. е.

закрытие:

var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

по формуле:

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}

4 ответов


первое-это сохраненное свойство, которое инициализируется через закрытие. Второе-вычисляемое свойство.

закрытие инициализации сохраненного свойства вызывается один раз и только один раз, но позже вы можете изменить значение сохраненного свойства (если вы не замените var С let). Это полезно, если вы хотите инкапсулировать код для инициализации сохраненного свойства в одном сжатом блоке кода.

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

в этом случае вы, несомненно, хотите сохранить свойство (первый пример), а не вычисленное свойство (второй пример). Вы, вероятно, не хотите нового push behavior object каждый раз, когда вы ссылаетесь на переменную.


кстати, в вашем первом примере вы внутренне ссылаетесь на то, что он создается лениво. Если вы хотите такое поведение, вы должны использовать lazy ключевые слова:

lazy var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

Если, однако, свойство static, он автоматически создается лениво.


основное отличие заключается в том, что вы не можете назначить что-то вычисляемому свойству, так как оно не имеет сеттера. В этом случае закрытие вызывается только один раз, а возвращаемое значение сохраняется в переменной, поэтому, если результат не меняется со временем, более эффективно использовать сохраненную переменную, а не вычисленную.

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

Sidenote: если вы не изменяете / переназначаете сохраненную переменную следует рассматривать как константу (let)


закрытие :

  //closure
    var pushBehavior: UIPushBehavior = {
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }()

при первом вызове переменной pushBehavior блок execute и value сохраняется в переменной pushBehavior. после этого всякий раз, когда вы вызываете pushBehavior, эти значения возвращаются.

означает только первый блочный код, выполненный и сохраненный в этой переменной. Кроме того, вы можете хранить значение переменной, когда захотите, но после этого это значение возвращается, но если вы объявите как "let", вы не сможете изменить это значение.

компьютерная свойство:

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}

в вычисляемом свойстве всякий раз, когда вы вызываете переменную pushBehavior, этот блок выполняет и возвращает значение. поэтому каждый раз блок выполняется. и вы не можете объявить переменную как ключевое слово " let " для переменной pushBehavior.

таким образом, вы можете использовать этот код в соответствии с вашим требованием.


Это не ответ, но просто стоит отметить, что:

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

следовательно, для вычисляемых и ленивых переменных вы можете получить доступ self или сохраненные свойства без беспокойства.