我试图用一个类,在一个关键NSDictionary
。 我看了看回答这个问题和我有什么几乎是一样的; 我使用setObject: forKey:
然而,抱怨的XCode,称Incompatible pointer types sending 'Class' to parameter of type 'id<NSCopying>'
。 呼叫我已经是:
[_bugTypeToSerializerDictionary setObject: bugToStringSerializer
forKey: [bugToStringSerializer serializedObjectType]];
bugToStringSerializer
是实例BugToStringSerializer
其具体实现实现serializedObjectType
。 具体实现的一个例子是这样的:
- (Class) serializedObjectType {
return [InfectableBug class];
}
我在做什么错在这里?
(看来类也符合 NSCopying
,但是他们的类型并不id <NSCopying>
编辑:类不符合协议。 当然,重要的是,班应对copy
和copyWithZone:
消息(这就是为什么你可以放心地忽略在这种情况下警告)。 它们的类型仍不 id <NSCopying>
这就是为什么编译器会抱怨。
如果你真的不想要那个丑陋的警告,只需执行一个显式类型转换:
[dictionary setObject:object forKey:(id <NSCopying>)someClass];
啊哈,我只是定格在我的项目的bug。
用这个:
NSStringFromClass([Someclass class]);
其他答案当然是有帮助的,但在这种情况下,它可能更有意义,只是使用NSMapTable ,它不会复制不同的NSDictionary的关键,而只是具有较强的指针保留它(默认情况下,虽然这是可以改变的)。
然后,你可以使用你原来的代码进行任何修改。
NSMapTable *_bugTypeToSerializerDictionary = [NSMapTable new];
...
[_bugTypeToSerializerDictionary setObject: bugToStringSerializer
forKey: [bugToStringSerializer serializedObjectType]];
这是少哈克,并在输送程序员的意图更清晰。
对于额外的样式点,你可以给实例变量像一个稍微更合适的名字_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,
};