Короче говоря, первое - это сохраненное свойство, которое инициализируется посредством замыкания, причем это замыкание вызывается только один раз, когда оно инициализируется. Второе - это вычисляемое свойство, блок get
которого вызывается каждый раз, когда вы ссылаетесь на это свойство.
Закрытие инициализации сохраненного свойства вызывается один раз и только один раз, но позже вы можете изменить значение сохраненного свойства (если вы не замените var
на let
). Это полезно, когда вы хотите инкапсулировать код для инициализации сохраненного свойства в одном кратком блоке кода.
Однако блок вычисляемого свойства вызывается каждый раз, когда вы ссылаетесь на переменную. Это полезно, когда вы хотите, чтобы код вызывался каждый раз, когда вы ссылаетесь на вычисляемое свойство. Обычно вы делаете это, когда вычисляемое свойство необходимо пересчитывать каждый раз, когда вы ссылаетесь на сохраненное свойство (например, пересчитывается из других, возможно частных, сохраненных свойств).
В этом случае вам, несомненно, понадобится сохраненное свойство (первый пример), а не вычисленное свойство (второй пример). По-видимому, вам не нужен новый объект поведения push каждый раз, когда вы ссылаетесь на переменную.
Между прочим, в вашем первом примере вы внутренне ссылаетесь на его ленивое создание. Если вы хотите такого поведения, вы должны использовать ключевое слово lazy
:
lazy var pushBehavior: UIPushBehavior = {
let behavior = UIPushBehavior()
behavior.setAngle(50, magnitude: 50)
return behavior
}()
Однако, если свойство равно static
, оно автоматически создается лениво.
person
Rob
schedule
20.07.2015