Problema al utilizar UIColor RGB negro como una llave en una NSMutableDictionary
-
10-10-2019 - |
Pregunta
Me puede establecer UIColor objetos como claves en un NSMutableDictionary todo el día y todo está bien y feliz ...
Por ejemplo:
[myDict setObject:foo forKey:[UIColor redColor]];
que funciona muy bien ... A menos trato de usar la siguiente:
UIColor *black = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:1];
[myDict setObject:foo forKey:black];
Eso siempre me da:
- [UIDeviceRGBColor copyWithZone:]: selector no reconocido enviado a la instancia 0x691be80
Las razones de por qué estoy definiendo negro en el espacio de color RGB no son importantes a esta pregunta, sólo sé que debo definir de esa manera. Lo que no entiendo es por qué es esto y sólo este color me causando un problema, y ??por qué es que el error es un error copyWithZone?
Para el registro, [UIColor blackcolor] funciona como una llave, pero debido a que no es un espacio de color RGB que no es adecuado para mi aplicación.
Solución
Parece que la mejor pregunta es "¿por qué todos los otros trabajos ejemplo UIColor como clave"?
Llaves en un NSMutableDictionary " debe cumplir con el protocolo NSCopying ". UIColor
objetos no se ajustan a ese protocolo por la documentación , por lo que es teóricamente capaz de utilizarlos como claves en un diccionario.
En la práctica, podría adivinar que usted está recibiendo diversas subclases concretas de un grupo de clases que se esconde por UIColor
, y tal vez algunos de ellos, de hecho, el apoyo NSCopying, pero UIDeviceRGBColor
no parece.
Se puede envolver el objeto UIColor en un objeto envoltorio delgado que hizo apoyo NSCopying, y anular -isEqualTo:
etc para conseguir las comparaciones con el trabajo correctamente, y luego usar esos envoltorios en el diccionario.