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

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

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

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

против

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

Ответ 1

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

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

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


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

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

Ответ 2

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

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

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

Ответ 3

Закрытие:

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

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

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

Вычисленное свойство:

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

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

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