2017-04-06 97 views
0

當重寫observeValue進行鍵值觀察時,您可以通過更改來查看更改是新的還是舊的? [.newKey]或更改? [.oldKey]。但我怎麼能檢查是否有沒有變化,但變化的只是當觀察者首先添加檢查鍵值是否爲初始類型觀察swift 3

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) 
{ 
    let newchange = change?[.newKey] 
    let oldchange = change?[.oldKey] 
} 

回答

2

documentation初始值:

通知將始終包含的變化詞典一個 new​Key條目,如果新也是指定,但不會包含一個 old​Key條目。 (在最初的通知 觀察屬性的當前值可能是舊的,但它是新的觀察者。)

所以,如果你想知道如果一個特定的變化是初始值,同時請求.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] 
+0

檢查,如果那裏有一個古老的關鍵..天才! – slimboy

+0

我得到了以上代碼的異常......「libC++ abi.dylib:終止於類型爲NSException的未捕獲異常」 – triiiiista