NSArray
no almacena información sobre los tipos de objetos que contienen. Si usted sabe con seguridad los tipos de objetos en su conjunto, puede realizar un molde, ya sea implícita o explícitamente:
NSString *n = [arr objectAtIndex:1]; // implicit type conversion (coercion) from id to NSString*
NSString *n = (NSString *)[arr objectAtIndex:1]; // explicit cast
No hay diferencia en el costo de tiempo de ejecución entre conversiones implícitas y explícitas, es sólo una cuestión de estilo. Si obtiene el tipo incorrecto, entonces lo más probable es que obtenga la temida excepción unrecognized selector sent to instance 0x12345678
.
Si usted tiene un conjunto heterogéneo de diferentes tipos de objetos, es necesario utilizar el método isKindOfClass:
para probar la clase del objeto:
id obj = [arr objectAtIndex:1];
if ([obj isKindOfClass:[NSString class] ])
{
// It's an NSString, do something with it...
NSString *str = obj;
...
}
Vale la pena señalar que no hay forma de distinguir entre NSStrings y NSMutableStrings en tiempo de ejecución; todos responden SÍ a 'isKindOfClass: [NSMutableString class]'. – Chuck
@Chuck: No lo sabía. ¿Cómo? –
@Chuck: Noté que NSString también devuelve SÍ a '[myNSString respondsToSelector: @" appendFormat:]; '. ISTM que las cadenas mutables e inmutables son implementadas por __NSCFString y que tiene un indicador interno que le dice si es mutable o no Si llama a '[myNSString appendFormat: @" world "];' obtendrá una excepción, pero no una que indique que no responde al selector. Aparentemente 'appendFormat:' verifica la bandera inmutable y, si está configurada, lanza una excepción. Las cadenas mutables e inmutables son, de facto, la misma clase, '__NSCFString'. –