NSSet到NSArray转换调用objectAtIndex?

时间:2012-01-24 10:13:27

标签: objective-c ios nsarray mkmapview nsset

我正在尝试通过删除可见区域外的所有注释来更新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:]:无法识别的选择器发送到实例0x13cd40 之后,我将newAnnotations转换为NSArray,然后添加注释。是否有关于将数组转换为集合导致此问题的内容?如果是这样,有没有办法围绕它?

6 个答案:

答案 0 :(得分:173)

尽管您将NSMutableSet投射到NSArray,但这个简单的投射不会让NSSet类回复NSArray的消息。您必须使用NSArray的元素填充实际NSSet,如下所示:

NSArray *array = [theNsSet allObjects];

答案 1 :(得分:6)

NSSet对象转换为NSArray将不会做任何让编译器认为对象是NSArray的事情。实际上,对象 NSSet对象,尝试将其用作NSArray会产生失败。

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

在某些情况下,转换是安全的,例如从派生类转换为基类时;或者当您完全确定基础对象的实际类型与您将其投射到的类型一致时。

无论如何,在您的特定情况下,您可以尝试使用以下命令通过NSArray访问NSSet元素:

 [newAnnotations allObjects]

This

  

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

答案 2 :(得分:5)

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

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

此外,satzkmr提出的解决方案为您提供了一个"不兼容的指针"警告。 (很抱歉在这里写这个,我没有足够的声誉来发表评论)。

答案 3 :(得分:3)

是的,您应该首先将该集存储到这样的数组中......

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

答案 4 :(得分:1)

按照步骤将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);

答案 5 :(得分:-1)

NSArray *array = [sets allObjets];