Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 无法使用';类别';作为字典中的一个键_Objective C_Class_Nsdictionary - Fatal编程技术网

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()配对时,这是一个非常合适的示例;