從documentation初始值:
通知將始終包含的變化詞典一個 newKey
條目,如果新也是指定,但不會包含一個 oldKey
條目。 (在最初的通知 觀察屬性的當前值可能是舊的,但它是新的觀察者。)
所以,如果你想知道如果一個特定的變化是初始值,同時請求.new
和.old
當你添加觀察者時,並且如果變化字典中沒有.oldKey
,這意味着這是初始值。
下面是一些快速的操場代碼來演示:
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
@objc class Test: NSObject {
var blah: String? = "Test" {
willSet {
self.willChangeValue(forKey: "blah")
}
didSet {
self.didChangeValue(forKey: "blah")
}
}
}
var test = Test()
@objc class Observer: NSObject {
func blah() {
test.addObserver(self, forKeyPath: "blah", options: [.initial, .new, .old], context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let change = change {
print(change)
}
}
}
var observer = Observer()
observer.blah()
test.blah = "Test2"
test.blah = nil
而這裏的輸出:
[__C.NSKeyValueChangeKey(_rawValue: new): Test, __C.NSKeyValueChangeKey(_rawValue: kind): 1]
[__C.NSKeyValueChangeKey(_rawValue: new): Test2, __C.NSKeyValueChangeKey(_rawValue: kind): 1, __C.NSKeyValueChangeKey(_rawValue: old): Test]
[__C.NSKeyValueChangeKey(_rawValue: new): <null>, __C.NSKeyValueChangeKey(_rawValue: kind): 1, __C.NSKeyValueChangeKey(_rawValue: old): Test2]
檢查,如果那裏有一個古老的關鍵..天才! – slimboy
我得到了以上代碼的異常......「libC++ abi.dylib:終止於類型爲NSException的未捕獲異常」 – triiiiista