在NSCache

时间:2015-10-22 13:43:04

标签: ios swift object struct

有没有办法在NSCache中存储struct值?当我阅读Apple文档时,您只能将AnyObject存储到它。有一些工作是将sturct转换为class,第二个将sturct值转换为字典,但如果数据集很大则它们是非常昂贵的操作。有什么建议吗?

3 个答案:

答案 0 :(得分:5)

我要把手臂放在'不'上(没有解决方法)。 NSCache在运行时的Objective-C方面非常响亮,编写为与NSObject一起使用,通过AnyObject桥接。与NSDictionaryNSArray不同,编译器之间没有等效的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];