无法使用“阶级”作为NSDictionary的关键(Unable to use 'class

2019-07-31 18:48发布

我试图用一个类,在一个关键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];
}

我在做什么错在这里?

Answer 1:

(看来类也符合 NSCopying ,但是他们的类型并不id <NSCopying> 编辑:类不符合协议。 当然,重要的是,班应对copycopyWithZone:消息(这就是为什么你可以放心地忽略在这种情况下警告)。 它们的类型仍不 id <NSCopying>这就是为什么编译器会抱怨。

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

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


Answer 2:

啊哈,我只是定格在我的项目的bug。

用这个:

NSStringFromClass([Someclass class]);


Answer 3:

其他答案当然是有帮助的,但在这种情况下,它可能更有意义,只是使用NSMapTable ,它不会复制不同的NSDictionary的关键,而只是具有较强的指针保留它(默认情况下,虽然这是可以改变的)。

然后,你可以使用你原来的代码进行任何修改。

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

这是少哈克,并在输送程序员的意图更清晰。

对于额外的样式点,你可以给实例变量像一个稍微更合适的名字_bugTypeToSerializerMap



Answer 4:

这是我一贯的代码:

@{
    (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,
};


文章来源: Unable to use 'class' as a key in NSDictionary