gpt4 book ai didi

swift - 非对象类型的 NSCache 行为

转载 作者:可可西里 更新时间:2023-11-01 01:37:58 25 4
gpt4 key购买 nike

下面的代码工作得很好,但我很惊讶,因为我认为 NSCache 需要对象键和值,并且不会采用 CGFloat。有人可以向我解释发生了什么吗?

class A
var cachedPoints = NSCache()

func rAt(theta theta: CGFloat) -> CGFloat {
if let r = self.cachedPoints.objectForKey(theta) as? CGFloat {
return r
}
// do some very expensive maths here...
let r = self.veryExpensiveFunction(theta)
self.cachedPoints.setObject(r, forKey: theta)
return r
}
}

最佳答案

来自 Working with Cocoa Data Types在里面“将 Swift 与 Cocoa 和 Objective-C 结合使用”文档:

Numbers

Swift automatically bridges certain native number types, such as Int and Float, to NSNumber.
...
It also allows you to pass a value of type Int, for example, to an argument expecting an NSNumber.

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

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

rtheta 都被包装到 NSNumber 实例中然后传递给带有两个参数的 setObject() 方法AnyObject 类型。

反方向也有桥接,不过就是记录较少(或者我找不到)。你可以投一个NSNumberCGFloat 的实例(或 Int, Float, ...)

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。否则,可选绑定(bind)失败。

关于swift - 非对象类型的 NSCache 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33482801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com