20

我正在尝试使用一个类作为NSDictionary. 我查看了这个问题的答案,我所拥有的几乎相同;我正在使用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

4 回答 4

36

(似乎类确实符合NSCopying但它们的类型不是id <NSCopying>。)编辑:类不符合协议。当然,最重要的是类响应copyandcopyWithZone:消息(这就是为什么在这种情况下您可以放心地忽略警告)。他们的类型仍然不是id <NSCopying>。)这就是编译器抱怨的原因。

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

[dictionary setObject:object forKey:(id <NSCopying>)someClass];
于 2012-09-21T06:43:57.543 回答
19

啊哈,我刚刚修复了我项目中的错误。

用这个:

NSStringFromClass([Someclass class]);
于 2012-09-21T06:38:30.527 回答
4

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

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

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

它不那么hacky,并且更清楚地传达了程序员的意图。

对于额外的样式点,您可以给实例变量一个更合适的名称,例如_bugTypeToSerializerMap.

于 2014-06-01T12:09:44.843 回答
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,
};
于 2017-03-21T10:44:37.520 回答