Разница между вычисленным свойством и свойством с закрытием
Я новичок в 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
}
}
Ответы
Ответ 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.
Таким образом, вы можете использовать этот код в соответствии с вашими требованиями.