为了学习KVO,我复制了https://developer.apple.com/documentation/swift/cocoa_design_patterns/using_key_value_observing_in_swift的代码。它如下
class MyObjectToObserve: NSObject {
@objc dynamic var myDate = NSDate(timeIntervalSince1970: 0) // 1970
func updateDate() {
myDate = myDate.addingTimeInterval(Double(2 << 30)) // Adds about 68 years.
}
}
class MyObserver: NSObject {
@objc var objectToObserve: MyObjectToObserve
var observation: NSKeyValueObservation?
init(object: MyObjectToObserve) {
objectToObserve = object
super.init()
observation = observe(
\.objectToObserve.myDate,
options: [.old, .new]
) { object, change in
print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)")
}
}
}
let observed = MyObjectToObserve()
let observer = MyObserver(object: observed)
observed.updateDate()
由于未使用observer
,因此第二行到最后一行将引发警告。按照Xcode的建议将let observer
替换为_
之后,警告消失但会产生运行时错误:
线程1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)
我的目标是回答以下问题:
1.有人知道它为什么会导致错误吗?
2.如何解决警告?
3.这个例子是关于Swift中KVO的最新版本吗?语法级别?
苹果文档中的代码片段仅作为示例 - 这不是一个完整的实现。
据推测,您将使用observer
做其他事情,此时您将不再获得“未使用”警告。
样本用法(仅用于演示,不被视为生产代码):
class ExampleViewController: UIViewController {
var observed: MyObjectToObserve!
var observer: MyObserver!
override func viewDidLoad() {
super.viewDidLoad()
observed = MyObjectToObserve()
observer = MyObserver(object: observed)
}
@IBAction func didTap(_ sender: Any) {
observed.updateDate()
}
}
创建一个新的视图控制器;把它的类设置为ExampleViewController
;添加一个按钮并将其连接到@IBAction func didTap
。
运行应用程序..每次点击按钮,您都会在调试控制台中看到print()
输出。