objective c - NSSet to NSArray casting llamada objectAtIndex?
objective-c ios (5)
A pesar de que estás lanzando NSMutableSet
a NSArray
, ese simple casting no hará que la clase NSSet
responda a los mensajes de NSArray
. Tienes que llenar una NSArray
real con los elementos del NSSet
como este:
NSArray *array = [theNsSet allObjects];
Estoy tratando de actualizar un MKMapView eliminando todas las anotaciones fuera del área visible, y agregando y eliminando algunas anotaciones dentro del área visible. Este es mi código:
NSSet *visibleAnnotations = [mapView annotationsInMapRect:[mapView visibleMapRect]];
NSSet *allAnnotations = [NSSet setWithArray:[mapView annotations]];
NSMutableSet *nonVisibleAnnotations = [NSMutableSet setWithSet:allAnnotations];
[nonVisibleAnnotations minusSet:visibleAnnotations];
[mapView removeAnnotations:(NSArray *)nonVisibleAnnotations];
NSMutableSet *newAnnotations = [NSMutableSet setWithArray:[_zoomLevels objectAtIndex:clusterLevel]];
[newAnnotations minusSet:visibleAnnotations];
[mapView addAnnotations:(NSArray *)newAnnotations];
Esto me da el error - [__ NSCFSet objectAtIndex:]: selector no reconocido enviado a la instancia 0x13cd40 después de la última línea en la que emito newAnnotations a un NSArray y luego agrego las anotaciones. ¿Hay algo acerca de lanzar una matriz a un conjunto que causa esto? Si es así, ¿hay alguna manera de evitarlo?
Lanzar un objeto NSSet
a NSArray
no hará nada más que engañar al compilador para que piense que el objeto es un NSArray
. En realidad, el objeto es un objeto NSSet
y tratar de usarlo como NSArray
producirá fallas.
Otra forma de verlo es que el lanzamiento no es más que un truco sobre los punteros, no sobre los objetos apuntados, que permanecen inalterados.
La conversión solo es segura en ciertos casos, como cuando se convierte de una clase derivada a una clase base; o cuando esté absolutamente seguro de que el tipo real del objeto subyacente es consistente con el tipo al que lo está convirtiendo.
De todos modos, en su caso específico, puede intentar acceder a los elementos NSSet a través de un NSArray mediante:
[newAnnotations allObjects]
Devuelve una matriz que contiene los miembros del conjunto, o una matriz vacía si el conjunto no tiene miembros.
Otra forma de obtener un NSMutableArray de un NSSet es
NSMutableArray * array= [[set allObjects] mutableCopy];
Además, la solución propuesta por satzkmr le da una advertencia de "puntero incompatible". (Lamento escribir esto aquí, no tengo suficiente reputación para comentar).
Sí, primero debes almacenar el conjunto en una matriz como esta ...
NSMutableArray *array = [NSMutableArray arrayWithArray:[set allObjects]];
Siguiendo los pasos a seguir para convertir un NSSet en NSArray o NSMutableArray,
NSSet *airports = [NSSet setWithObjects:@"Chennai",@"Mumbai",@"Delhi", nil];
NSLog(@"Set Elemets Before Move:%@", airports);
NSMutableArray *movedAirports = [airports allObjects];
NSLog(@"Array Elements After Moving from Set:%@", movedAirports);