NSSet转换为NSArray后,如何使用objectAtIndex方法?

50

我正在尝试通过移除可视区域外的所有注释并添加和删除可视区域内的某些注释来更新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];

在将newAnnotations强制转换为NSArray后添加注释,最后一行会出现错误-[__NSCFSet objectAtIndex:]: unrecognized selector sent to instance 0x13cd40。是否将数组强制转换为集合会导致此错误?如果是,有没有解决方法?

6个回答

187
尽管你将 NSMutableSet 转换为 NSArray,但这种简单的转换并不能使 NSSet 类响应 NSArray 的消息。你必须像这样用 NSSet 的元素填充一个实际的 NSArray
NSArray *array = [theNsSet allObjects];

4
allObjects改变了顺序,因此objectAtIndex可能无法返回预期的结果。 - Vignesh
11
非因果关系。一个集合没有顺序。 - user529758
这里建议的解决方案对我不起作用... [theNSSet allObjects] 简单地将 NSSet 作为一个对象添加到 NSArray 中,这是失败的,因为我不需要一个包含 NSSet 的 NSArray,我需要从 NSSet 的内容中得到一个 NSArray。 - Logicsaurus Rex
1
@LogicsaurusRex allObjects 返回一个包含 Set 成员的数组。这个解决方案应该适用于你。 - Psiticosis

6
将一个 NSSet 对象转换为 NSArray,只是欺骗编译器认为该对象是一个 NSArray,实际上,该对象仍然是一个 NSSet 对象。试图将其当作 NSArray 使用将导致失败。
从另一个角度看,强制类型转换只是对指针的一种操作,并不会改变被指向的对象的内容。
强制类型转换只在某些情况下才是安全的,例如:从派生类转换到基类或者你绝对确定底层对象的真实类型与要转换的类型一致时。
无论如何,在您的具体情况下,您可以尝试通过以下方式使用 NSArray 访问 NSSet 元素:
 [newAnnotations allObjects]

这里

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


5
另一种从NSSet获取NSMutableArray的方法是:
NSMutableArray * array= [[set allObjects] mutableCopy];

此外,satzkmr提出的解决方案会导致“不兼容指针”警告。(很抱歉在此写下这句话,我声望不够无法评论。)

3

是的,你首先应该将集合存储到一个数组中,像这样...

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

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

-1
NSArray *array = [sets allObjets];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接