objective-c class nsdictionary

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 .