NSSet NSArray铸造调用objectAtIndex?

我试图更新MKMapView通过删除可见区域外的所有注释,并添加和删除可见区域内的一些注释。 这是我的代码:

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]; 

这给了我错误– [__ NSCFSet objectAtIndex:]:无法识别的select器发送到实例0x13cd40最后一行后,我将newAnnotations投给NSArray然后添加注释。 有什么关于将一个数组转换成一个导致这个问题的集合吗? 如果是的话,有没有办法呢?

尽pipe你将NSMutableSetNSArray ,但是这种简单的转换不会使NSSet类响应NSArray的消息。 你必须用这样的NSSet的元素填充一个实际的NSArray

 NSArray *array = [theNsSet allObjects]; 

将一个NSSet对象转换成NSArray不会做任何其他的让编译器认为该对象是一个NSArray 。 实际上,该对象一个NSSet对象,并试图使用它作为一个NSArray会产生失败。

另一种看待它的方式是投射只是指针上的一个技巧,而不是指向对象上的技巧,它们保持不变。

在某些情况下,铸造只是安全的,就像从派生类转换到基类时一样; 或者当你完全确定底层对象的真实types与你正在使用的types一致时。

无论如何,在你的具体情况下,你可能会尝试通过使用NSArray访问NSSet元素:

  [newAnnotations allObjects] 

这个

返回包含集合成员的数组,如果集合没有成员,则返回一个空数组。

另一种从NSSet获取NSMutableArray的方法是

 NSMutableArray * array= [[set allObjects] mutableCopy]; 

此外,由satzkmr提出的解决scheme给你一个“不兼容的指针”警告。 (对不起,在这里写,我没有足够的声望评论)。

是的,你应该先把这个数据存储到这个数组中

 NSMutableArray *array = [NSMutableArray arrayWithArray:[set allObjects]]; 

下面的步骤将NSSet转换成NSArray或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);