Swift中的Casting没有按预期工作

时间:2015-11-02 06:59:02

标签: swift casting optional

这是我的代码的一部分:

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 类型。

3 个答案:

答案 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()})
}