无法在NSDictionary中使用“class”作为键

时间:2012-09-21 06:29:47

标签: objective-c class nsdictionary

我正在尝试将一个类用作NSDictionary中的键。我看了this question的答案,我所拥有的几乎是一样的;我正在使用setObject: forKey:。但是,XCode抱怨说Incompatible pointer types sending 'Class' to parameter of type 'id<NSCopying>'。我的电话是:

[_bugTypeToSerializerDictionary setObject: bugToStringSerializer 
                                forKey: [bugToStringSerializer serializedObjectType]];

bugToStringSerializerBugToStringSerializer的一个实例,其具体实现实现serializedObjectType。具体实现的示例如下所示:

- (Class) serializedObjectType {
    return [InfectableBug class];
}

我在这里做错了什么?

4 个答案:

答案 0 :(得分:35)

(似乎类符合NSCopying,但其类型不是id <NSCopying>。)编辑:类不符合协议。当然,重要的是类会响应copycopyWithZone:消息(这就是为什么你可以安全地忽略这种情况下的警告)。他们的类型仍然而不是id <NSCopying>。)这就是编译器抱怨的原因。

如果你真的不想要那个丑陋的警告,只需执行一个显式的类型转换:

[dictionary setObject:object forKey:(id <NSCopying>)someClass];

答案 1 :(得分:19)

啊哈,我刚刚解决了项目中的错误。

使用它:

NSStringFromClass([Someclass class]);

答案 2 :(得分:4)

其他答案肯定是有帮助的,但在这种情况下,使用NSMapTable可能更有意义,它不像NSDictionary那样复制键,只是用强指针保留它(默认情况下,虽然这可以改变。)

然后您可以使用原始代码而无需修改。

NSMapTable *_bugTypeToSerializerDictionary = [NSMapTable new];
...
[_bugTypeToSerializerDictionary setObject: bugToStringSerializer
                                   forKey: [bugToStringSerializer serializedObjectType]];

它不那么狡猾,而且更清楚地传达程序员的意图。

对于额外的样式点,您可以为实例变量赋予一个稍微合适的名称,如_bugTypeToSerializerMap

答案 3 :(得分:0)

这是我通常的代码:

@{
    (id)[MyClass1 class] : @1,
    (id)[MyClass2 class] : @2,
    (id)[MyClass3 class] : @3,
    (id)[MyClass4 class] : @4,
};

但最近我发现了这种方法:

@{
    MyClass1.self : @1,
    MyClass2.self : @2,
    MyClass3.self : @3,
    MyClass4.self : @4,
};