objective c - No se puede usar ''clase'' como clave en NSDictionary
objective-c class (4)
(Parece que las clases se ajustan a NSCopying
, sin embargo, su tipo no es id <NSCopying>
). Editar: las clases no se ajustan a los protocolos. Por supuesto, lo esencial es que las clases respondan a los mensajes copy
y copyWithZone:
(y es por eso que puede ignorar la advertencia en este caso). Su tipo aún no es id <NSCopying>
.) Es por eso que el compilador se queja.
Si realmente no quieres esa fea advertencia, simplemente realiza una conversión de tipo explícita:
[dictionary setObject:object forKey:(id <NSCopying>)someClass];
Estoy tratando de usar una clase como clave en un NSDictionary
. Miré la respuesta a esta pregunta y lo que tengo es casi lo mismo; Estoy usando setObject: forKey:
Sin embargo, XCode se queja, diciendo que los Incompatible pointer types sending ''Class'' to parameter of type ''id<NSCopying>''
. La llamada que tengo es:
[_bugTypeToSerializerDictionary setObject: bugToStringSerializer
forKey: [bugToStringSerializer serializedObjectType]];
bugToStringSerializer
es una instancia de BugToStringSerializer
cuyas implementaciones concretas implementan serializedObjectType
. Un ejemplo de una implementación concreta se ve así:
- (Class) serializedObjectType {
return [InfectableBug class];
}
¿Qué estoy haciendo mal aquí?
Ajá, acabo de arreglar el error en mi proyecto.
utilizar esta:
NSStringFromClass([Someclass class]);
Este es mi código habitual:
@{
(id)[MyClass1 class] : @1,
(id)[MyClass2 class] : @2,
(id)[MyClass3 class] : @3,
(id)[MyClass4 class] : @4,
};
Pero recientemente he descubierto este enfoque:
@{
MyClass1.self : @1,
MyClass2.self : @2,
MyClass3.self : @3,
MyClass4.self : @4,
};
Las otras respuestas son ciertamente útiles, pero en este caso probablemente tenga más sentido simplemente usar un NSMapTable , que no copia la clave a diferencia del NSDictionary, y simplemente lo retiene con un puntero fuerte (por defecto, aunque esto puede cambiarse).
Entonces puedes usar tu código original sin modificaciones.
NSMapTable *_bugTypeToSerializerDictionary = [NSMapTable new];
...
[_bugTypeToSerializerDictionary setObject: bugToStringSerializer
forKey: [bugToStringSerializer serializedObjectType]];
Es menos intrépido y es más claro al transmitir la intención del programador.
Para puntos de estilo adicionales, podría _bugTypeToSerializerMap
la variable de instancia un nombre ligeramente más adecuado, como _bugTypeToSerializerMap
.