You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何缓存Double数组?解决NSCache类型不匹配报错

解决NSCache缓存Double数组的类型问题

这个问题我之前也碰到过——NSCache的泛型参数要求键和值都必须是类类型(Class Type),而Swift里的[Double]是结构体(Struct),不符合NSCache的类型约束,所以才会抛出'NSCache' requires that '[Double]' be a class type这个错误。下面给你两种实用的解决思路:

方法一:利用NSArray桥接Swift数组

NSArray是Objective-C的类类型,可以直接和Swift的[Double]无缝桥接,刚好满足NSCache的要求:

// 初始化缓存,键用NSString,值用NSArray
let cache = NSCache<NSString, NSArray>()

// 存入Double数组
let targetArray = [3.14, 2.718, 1.618]
cache.setObject(targetArray as NSArray, forKey: "math_constants" as NSString)

// 取出并转成Swift数组
if let cachedNSArray = cache.object(forKey: "math_constants" as NSString),
   let cachedArray = cachedNSArray as? [Double] {
    print("取出缓存的数组:\(cachedArray)")
}

这里把Swift的[Double]转成NSArray存入,取出时再转回[Double]即可;键的处理也很简单,把Swift的String转成NSString就能直接用。

方法二:自定义包装类(更Swift风格)

如果不想依赖Objective-C的NSArray,也可以自己写一个轻量的包装类,把[Double]包成类类型:

// 定义包装类,仅持有Double数组
class DoubleArrayContainer {
    let content: [Double]
    init(_ content: [Double]) {
        self.content = content
    }
}

// 初始化缓存,键用NSString,值用自定义的包装类
let cache = NSCache<NSString, DoubleArrayContainer>()

// 存入数据
let targetArray = [1.0, 3.0, 5.0]
cache.setObject(DoubleArrayContainer(targetArray), forKey: "odd_numbers" as NSString)

// 取出数据
if let container = cache.object(forKey: "odd_numbers" as NSString) {
    print("取出缓存的数组:\(container.content)")
}

这种方式类型更安全,不用来回做桥接转换,适合需要明确类型约束的场景。

关于键的补充说明

如果想用Swift的String作为键,只需要把它转成NSString即可——因为Swift String和NSString是无缝桥接的,直接用"your_key" as NSString或者NSString(string: "your_key")都可以正常使用。

内容的提问来源于stack exchange,提问作者AJ Z.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:03:04