具有非对象类型的NSCache行为

时间:2015-11-02 16:52:56

标签: swift nscache

以下代码运行良好,但我很惊讶,因为我认为set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "foo" "bar" "baz") 需要对象键和&值,不会NSCache。有人可以向我解释发生了什么吗?

CGFloat

1 个答案:

答案 0 :(得分:2)

来自Working with Cocoa Data Types “将Swift与Cocoa和Objective-C一起使用”文档:

  

<强>数字

     

Swift会自动桥接某些原生数字类型,例如Int   和FloatNSNumber   ...
  它还允许您将类型Int的值传递给期望NSNumber的参数。

文档提及IntUIntFloatDoubleBool 作为自动桥接到NSNumber的类型,但显然 这适用于CGFloat(如果导入了“Foundation”)。 所以在

self.cachedPoints.setObject(r, forKey: theta)

rtheta都包含在NSNumber个实例中 然后传递给setObject()方法,该方法有两个参数 类型为AnyObject

反方向还有一个桥接,但也就是说 记录不完整(或者我找不到)。你可以施展 NSNumberCGFloat的实例(或IntFloat,...)

let num : NSNumber = ...
let x = num as CGFloat

,结果与您在数字实例上调用doubleValue(或floatValue,具体取决于架构)相同。 在

let obj : AnyObject = ...
let y = obj as? CGFloat // CGFloat?

对象可选地强制转换为NSNumber并且 - 如果成功的话 - 转换为CGFloat,如上例所示。

这就是

中发生的事情
if let r = self.cachedPoints.objectForKey(theta) as? CGFloat { ... }

如果objectForKey()的返回值为NSNumber,那么 它会转换为CGFloat并分配给r。除此以外, 可选的绑定失败。