2016-08-23 202 views
0

我有一个使用KVO功能的代码。错误:执行中断,原因:EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,subcode = 0x0)

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
    ... 
    let oldRect = change?[NSKeyValueChangeOldKey] as! NSRect 

所以,当我试图投价值的NSRect我收到错误:

error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0). 

和对象是的NSRect类型的对象:

(lldb) po change?[NSKeyValueChangeOldKey] 
▿ Optional<AnyObject> 
    - Some : NSRect: {{293, 21}, {108, 108}} 

回答

1

如你所知, changeobserveValueForKeyPath(_:ofObject:change:context:)的参数类型为[String : AnyObject]?,内部为NSDictionary,它不能包含NSRange作为值。

因此,KVO将该值转换为包含NSRangeNSValue。但不幸的是,它不能直接桥接到Swift中的NSRange

尝试这样:

let oldRect = (change?[NSKeyValueChangeOldKey] as! NSValue).rectValue 
相关问题