Метод observe
- это то, что нужно, будь то с некоторыми изменениями в вашем коде.
Измените свой класс Concentration
на следующий:
class Concentration: NSObject {
@objc dynamic var flipCount = 0
}
InДля работы KVO в Swift свойства должны быть помечены как @objc
и dynamic
. Класс должен наследоваться от NSObject
для предотвращения ошибок во время выполнения.
Ваш класс ViewController
должен выглядеть примерно так:
class ViewController: UIViewController {
@objc lazy var game = Concentration()
@IBOutlet weak var flipCountLabel: UILabel!
private var observation: NSKeyValueObservation?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.observation = self.observe(\.game.flipCount) { _, _ in
self.flipCountLabel.text = "\(self.game.flipCount)"
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
self.observation = nil
}
}
Свойство game
необходимо пометить @objc
(еще раз для предотвращения ошибок во время выполнения). Кроме того, документация по методу observe
гласит
, когда возвращаемое или недействительное возвращенное NSKeyValueObservation перестает наблюдать
. Вот почему вам нужно сохранитьсильная ссылка на значение, возвращаемое методом observe
.
Также рассмотрите возможность использования обозначения KeyPath, которое я использовал здесь. Если вы сделаете опечатку, она не будет выполнена при компиляции, а не во время выполнения.
Надеюсь, это поможет вам!