2014-09-21 5 views
5

मैंने .Old | .New विकल्पों के साथ एक पर्यवेक्षक बनाया है। हैंडलर विधि में मैं मूल्यों के बाद से पहले लाने के लिए प्रयास करते हैं, लेकिन संकलक शिकायत: 'NSString' 'NSDictionaryIndex के लिए परिवर्तनीय नहीं है: NSObject, AnyObjectस्विफ्ट में ValueForKeyPath को देखने में पुराने/नए मान कैसे प्राप्त करें?

override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: [NSObject : AnyObject]!, context: UnsafeMutablePointer<Void>) { 

    let approvedOld = change[NSKeyValueChangeOldKey] as Bool 
    let approvedNew = change[NSKeyValueChangeNewKey] as Bool 

उत्तर

8

आप आप क्या चाहते करने के लिए परिवर्तन शब्दकोश टाइपकास्ट करने के लिए है। चूंकि परिवर्तन शब्दकोश है [NSObject: AnyObject], आपको इसे [NSString: Bool] पर डालना पड़ सकता है क्योंकि आप उस तरह के मूल्य की अपेक्षा करते हैं।

let ApprovalObservingContext = UnsafeMutablePointer<Int>(bitPattern: 1) 
override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: [NSObject : AnyObject]!, context: UnsafeMutablePointer<Void>) { 
    if context == ApprovalObservingContext{ 
     if let theChange = change as? [NSString: Bool]{ 
     if let approvedOld = theChange[NSKeyValueChangeOldKey] { 

     } 
     if let approvedNew = theChange[NSKeyValueChangeNewKey]{ 


     } 
     } 
    }else{ 
     super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
    } 
    } 

संपादित करें:

स्विफ्ट 2.0 के साथ, यहाँ एक वर्ग KVO का उपयोग करता है के लिए एक पूर्ण कार्यान्वयन है,

class Approval: NSObject { 

    dynamic var approved: Bool = false 

    let ApprovalObservingContext = UnsafeMutablePointer<Int>(bitPattern: 1) 

    override init() { 
     super.init() 
     addObserver(self, forKeyPath: "approved", options: [.Old, .New], context: ApprovalObservingContext) 
    } 

    override func observeValueForKeyPath(keyPath: String?, 
             ofObject object: AnyObject?, 
                change: [String : AnyObject]?, 
                context: UnsafeMutablePointer<Void>) { 

     if let theChange = change as? [String: Bool] { 

      if let approvedOld = theChange[NSKeyValueChangeOldKey] { 
       print("Old value \(approvedOld)") 
      } 

      if let approvedNew = theChange[NSKeyValueChangeNewKey]{ 
       print("New value \(approvedNew)") 

      } 

      return 
     } 
     super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
    } 

    deinit { 
     removeObserver(self, forKeyPath: "approved") 
    } 
} 

let a = Approval() 
a.approved = true 
+0

इस कोड संकलन नहीं है। त्रुटि: '[स्ट्रिंग: AnyObject]? ' परिवर्तनीय नहीं है '[एनएसएसटींग: बूल]' ' – RaffAl

+1

@Bearwithme अब अपडेट अपडेट करें। – Sandeep

+0

बहुत बढ़िया! फिक्सिंग के लिए बहुत बहुत धन्यवाद! – RaffAl

संबंधित मुद्दे