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你将NSMutableSet
为NSArray
,但是这种简单的转换不会使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);