Objective c 无法使用';类别';作为字典中的一个键
我正在尝试使用类作为Objective c 无法使用';类别';作为字典中的一个键,objective-c,class,nsdictionary,Objective C,Class,Nsdictionary,我正在尝试使用类作为NSDictionary中的键。我看了一下答案,我得到的答案几乎是一样的;我正在使用setObject:forKey:。然而,XCode抱怨说,不兼容的指针类型将'Class'发送到'id'类型的参数。。我接到的电话是: [_bugTypeToSerializerDictionary setObject: bugToStringSerializer forKey: [bugToStringSerializer
NSDictionary
中的键。我看了一下答案,我得到的答案几乎是一样的;我正在使用setObject:forKey:
。然而,XCode抱怨说,不兼容的指针类型将'Class'发送到'id'类型的参数。
。我接到的电话是:
[_bugTypeToSerializerDictionary setObject: bugToStringSerializer
forKey: [bugToStringSerializer serializedObjectType]];
bugToStringSerializer
是bugToStringSerializer
的一个实例,其具体实现实现了serializedObjectType
。具体实现的示例如下所示:
- (Class) serializedObjectType {
return [InfectableBug class];
}
我做错了什么?啊哈,我刚刚修复了项目中的错误 使用以下命令:
NSStringFromClass([Someclass class]);
(看起来类确实符合NSCopying
,但是它们的类型不是id
)编辑:类不符合协议。当然,最重要的是类响应copy
和copyWithZone:
消息(这就是为什么在这种情况下可以安全地忽略警告)。它们的类型仍然不是id
),这就是编译器抱怨的原因
如果您真的不想看到这种难看的警告,只需执行显式类型转换:
[dictionary setObject:object forKey:(id <NSCopying>)someClass];
[dictionary setObject:object forKey:(id)someClass];
其他答案当然很有帮助,但在这种情况下,使用一个与NSDictionary不同的、不会复制密钥的字典可能更有意义,它只是用一个强指针保留密钥(默认情况下,尽管可以更改)
然后,您可以只使用原始代码而不进行任何修改
NSMapTable *_bugTypeToSerializerDictionary = [NSMapTable new];
...
[_bugTypeToSerializerDictionary setObject: bugToStringSerializer
forKey: [bugToStringSerializer serializedObjectType]];
它不那么刺耳,而且在传达程序员意图方面更清晰
对于额外的样式点,您可以给实例变量一个稍微合适的名称,如\u bugTypeToSerializerMap
这是我常用的代码:
@{
(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,
};
您只能将对象用作其类(本例中为类对象的元类)符合NSCoding的键。课程没有。@H2CO3有趣。。。那么它是如何工作的呢?我刚刚试过,它确实工作了,看起来类是可以复制的。对不起,我错了。嗯,这让我回到我的问题:)我做错了什么?我看不出我所做的与问题中给出的答案有什么不同。非常奇怪!你做错的是你对编译器的误报太敏感:)看我的答案。(说真的,你没有做错任何事。)@VivinPaliath我知道这是一个警告-我经常阅读编译器消息,所以我习惯了警告和错误是什么:)@ios6中的VivinValiath我的编译器将其视为错误。-=|||@(无法理解的Unicode字符):这是编译器设置的问题。如果从编译器选项中删除
-Werr-Wall-pedantic
,它将衰减为警告。类对象(元类实例)实际上不符合任何协议,除了NSObject
(它们从根类NSObject
继承)。但是,由于NSObject
中的+copyWithZone:
方法,NSDictionary
只关心copyWithZone:
消息,因此它们确实会响应copyWithZone:
消息;不是NSCoding,使用NSCoding不会使警告消失…我不明白为什么这会被否决,当与NSClassFromString()配对时,这是一个非常合适的示例;