这是我的代码的一部分:
if let newValue = change?[NSKeyValueChangeNewKey] {
print("\(newValue)")
faceBounds = newValue as? CGRect
print("\(faceBounds)" + " in controller")
dispatch_async(dispatch_get_main_queue(),{ () -> Void in self.updateFaceRectView()})
}
其中" faceBounds"是CGRect?类型。
但是,这是我得到的系统的输出:
NSRect:{{116.24999,337.49997},{86.249992,86.249992}}
控制器中没有
发生了什么事?为什么不是" faceBounds"得到正确的价值?
[UPDATE]
也试过这个,
if let newValue = change?[NSKeyValueChangeNewKey] {
var str: String?
str = newValue as? String
print("\(str)")
// Still prints nil
}
我使用铸造错误的知识吗?
如果有人想知道, newValue 是 AnyObject 类型。
答案 0 :(得分:0)
正如documentation所述:
AnyObject可以表示任何类类型的实例。
NSRect(和CGRect)是结构类型而不是类类型,因此它们与AnyObject
不兼容,因此newValue as? CGRect
将不起作用。您可以先尝试将转换投射到Any
,然后尝试向下转换为CGRect
。
let newValue = change?[NSKeyValueChangeNewKey] as! Any
faceBounds = newValue as? CGRect
答案 1 :(得分:0)
好的,我找到了一个解决方法"现在":
faceBounds = newChange.CGRectValue
这解决了 nil 问题,但根本没有投射。如果有人有更多"铸造"喜欢的方式,请随时发表您的答案。
答案 2 :(得分:0)
您可以使用Foundation的NSRectToCGRect()
:
if let newValue = change?[NSKeyValueChangeNewKey] {
print("\(newValue)")
faceBounds = NSRectToCGRect(newValue)
print("\(faceBounds)" + " in controller")
dispatch_async(dispatch_get_main_queue(),{ () -> Void in self.updateFaceRectView()})
}