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.
相关产品推荐
相关产品推荐

