有没有办法在NSCache中存储struct值?当我阅读Apple文档时,您只能将AnyObject存储到它。有一些工作是将sturct转换为class,第二个将sturct值转换为字典,但如果数据集很大则它们是非常昂贵的操作。有什么建议吗?
答案 0 :(得分:5)
我要把手臂放在'不'上(没有解决方法)。 NSCache
在运行时的Objective-C方面非常响亮,编写为与NSObject
一起使用,通过AnyObject
桥接。与NSDictionary
和NSArray
不同,编译器之间没有等效的Swift集合。
除了实现点之外:NSCache
根本不存在于理解比C原子更复杂的价值语义的世界。
话虽这么说,可能最简单的解决方法就是为你的struct创建一个对象容器,使桥接显式但由任何想要使用缓存的人拥有:
class YourStructHolder: NSObject {
let thing: YourStruct
init(thing: YourStruct) {
self.thing = thing
}
}
cache.setObject(YourStructHolder(thing: thing), forKey:"Whatever")
(cache.objectForKey("Whatever") as? YourStructHolder)?.thing
...或者如果您对可变性感到满意,请跳过init
并使用var ...: YourStruct?
。无论如何,在与高速缓存交谈时,你将不得不处理可选性。
答案 1 :(得分:4)
在这种情况下,最好的选择是使用模板。这样,你就可以保持类型安全,而且你不必强迫转发。
<div class="shape"></div>
答案 2 :(得分:0)
我不认为将结构转换为NSValue是非常昂贵的(两者都是纯粹的数据),但你必须做一些测量:
struct myStruct {
int x;
int y;
};
typedef struct myStruct myStruct;
包装:
NSValue *object = [NSValue value:&myStruct withObjCType:@encode(myStruct)];
打开包装:
myStruct struct;
[object getValue:&struct];