Ленивый экземпляр UIDynamicAnimator с referenceView - Swift
Я пытаюсь создать ленивый экземпляр UIDynamicAnimator в моем коде. Я хочу инициализировать его UIView как IBOutlet, который у меня есть.
class ViewController: UIViewController {
@IBOutlet var gameView : UIView
@lazy var animator = UIDynamicAnimator(referenceView: gameView)
...
Я предполагаю, что это не работает, потому что UIView еще не создан, потому что свойство animator возвращает ошибку, говоря, что не может найти gameView.
Как я могу обойти это?
2 ответа
В видео-сессии "Построение прерываемых и отзывчивых взаимодействий" они сделали именно это.
Решение состоит в том, чтобы определить animator
как дополнительный и инициализировать его внутри viewDidLoad
,
class ViewController: UIViewController {
var animator : UIDynamicAnimator?
@IBOutlet var gameView : UIView
override func viewDidLoad() {
super.viewDidLoad()
animator = UIDynamicAnimator(referenceView: gameView)
animator!.property = value
...
}
...
Мне немного не нравится это, потому что будущие ссылки на animator
нужно будет все развернуть.
Немного лучший подход imo состоит в том, чтобы определить его как неявно развернутый необязательный. Так это будет выглядеть так:
class ViewController: UIViewController {
var animator : UIDynamicAnimator!
@IBOutlet var gameView : UIView
override func viewDidLoad() {
super.viewDidLoad()
animator = UIDynamicAnimator(referenceView: gameView)
animator.property = value
...
}
...
Используйте закрытие:
lazy private var dynamo: UIDynamicAnimator = {
return UIDynamicAnimator(referenceView: self.view)
}()
"Ленивый" означает, что он не будет инициализирован до первого использования.
Закрытие имеет доступ к self.view (или какому-либо другому локальному представлению, которое вы хотите использовать), но оно не пытается прочитать его, пока не произойдет первое чтение "динамо".
Мне нравится это как сочетание чистого и безопасного.