错误:执行被中断,原因:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

时间:2016-08-23 07:22:02

标签: swift macos casting

我有一个使用KVO功能的代码。

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 个答案:

答案 0 :(得分:1)

如您所知,change的{​​{1}}参数属于observeValueForKeyPath(_:ofObject:change:context:)类型,而且在内部,它是[String : AnyObject]?,不能包含NSDictionary值。

因此,KVO将值转换为包含NSRange的{​​{1}}。但不幸的是,它无法直接与Swift中的NSValue桥接。

尝试这样的事情:

NSRange