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

これにより、-[__NSCFSet objectAtIndex:]: unrecognized selector sent to instance 0x13cd40というエラーが表示されます。newAnnotationsを NSArray にキャストしてから注釈を追加する最後の行の後にあります。これを引き起こすセットに配列をキャストすることについて何かありますか? もしそうなら、それを回避する方法はありますか?

4

6 に答える 6

186

NSMutableSetにキャストしているにもかかわらず、その単純なキャストではクラスがのメッセージに応答しNSArrayません。実際の要素を次のように入力する必要があります。NSSetNSArrayNSArrayNSSet

NSArray *array = [theNsSet allObjects];
于 2012-01-24T10:16:34.577 に答える
6

NSSetオブジェクトを にキャストしNSArrayても、コンパイラをだましてオブジェクトがNSArray. 実際には、オブジェクトオブジェクトであり、NSSetそれを として使用しようとするとNSArray失敗します。

それを理解する別の方法は、キャストは、変更されないままである、ポイント先のオブジェクトではなく、ポインターに対する単なるトリックであるということです。

キャストは、派生クラスから基底クラスにキャストする場合など、特定の場合にのみ安全です。または、基になるオブジェクトの実際の型がキャスト先の型と一致することが絶対に確実な場合。

とにかく、特定のケースでは、次を使用して NSArray を介して NSSet 要素にアクセスしようとする場合があります。

 [newAnnotations allObjects]

これ

セットのメンバーを含む配列、またはセットにメンバーがない場合は空の配列を返します。

于 2012-01-24T10:15:55.253 に答える
5

NSSet から NSMutableArray を取得する別の方法は、

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

また、 satzkmr によって提案された解決策では、「互換性のないポインター」という警告が表示されます。(ここにこ​​れを書いて申し訳ありません。コメントするのに十分な評判がありません)。

于 2014-06-10T19:05:05.553 に答える
3

はい、最初にセットを次のような配列に格納する必要があります...

NSMutableArray *array = [NSMutableArray arrayWithArray:[set allObjects]];
于 2012-07-03T06:45:18.320 に答える
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);
于 2013-11-13T10:00:02.930 に答える