2012-01-24 29 views
37

Tôi đang cố cập nhật MKMapView bằng cách xóa tất cả các chú thích bên ngoài vùng hiển thị và thêm và xóa một số chú thích bên trong vùng hiển thị. Đây là mã của tôi:NSSet để NSArray gọi đối tượng castingAtIndex?

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

này mang lại cho tôi những lỗi - [__ NSCFSet objectAtIndex:]: chọn không được công nhận gửi đến dụ 0x13cd40 sau dòng cuối cùng mà tôi đúc newAnnotations đến một NSArray sau đó thêm các chú thích. Có một cái gì đó về việc đúc một mảng đến một bộ gây ra điều này? Nếu vậy, có cách nào làm tròn nó không?

Trả lời

160

Mặc dù bạn đang đúc NSMutableSet-NSArray, mà đúc đơn giản sẽ không làm cho NSSet lớp đáp ứng với thông điệp NSArray 's. Bạn phải điền một thực tế NSArray với các yếu tố của NSSet như thế này:

NSArray *array = [theNsSet allObjects]; 
+4

allObjects thay đổi thứ tự.So objectAtIndex có thể không trả về dự định. – Vignesh

+10

@Vignesh Non sequitur. Một bộ không được đặt hàng. –

+0

Giải pháp được đề xuất ở đây không hiệu quả đối với tôi ...'[theNSSet allObjects]' chỉ cần thêm NSSet như một đối tượng bên trong một NSArray, đó là một thất bại, bởi vì tôi không cần một NSSet INSIDE một NSArray, tôi cần một NSArray FROM nội dung của NSSet –

5

Đúc một đối tượng NSSet tới NSArray sẽ không làm bất kỳ điều gì khác khiến trình biên dịch nghĩ rằng đối tượng là NSArray. Trên thực tế, đối tượng một đối tượng NSSet và cố sử dụng nó làm NSArray sẽ tạo ra lỗi.

Một cách khác để xem đó là việc truyền chỉ là một mẹo trên con trỏ, không phải trên các đối tượng được trỏ tới, mà vẫn không thay đổi gì.

Truyền chỉ an toàn trong một số trường hợp nhất định, như khi bạn truyền từ một lớp dẫn xuất sang một lớp cơ sở; hoặc khi bạn hoàn toàn chắc chắn rằng loại đối tượng cơ bản thực sự phù hợp với loại bạn đang truyền nó đến.

Dù sao, trong trường hợp cụ thể của bạn, bạn có thể thử truy cập vào các yếu tố NSSet qua một NSArray bằng cách sử dụng:

[newAnnotations allObjects] 

This

Trả về một mảng chứa các thành viên của bộ, hoặc một sản phẩm nào mảng nếu tập hợp không có thành viên.

3

Vâng, đầu tiên bạn nên lưu trữ các thiết lập vào một mảng như thế này ...

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

Sau Bước được sau đó để chuyển đổi một NSSet vào NSArray hoặc 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

một cách khác để có được một NSMutableArray từ một NSSet là

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

Ngoài ra, giải pháp được đề xuất bởi satzkmr cung cấp cho bạn cảnh báo "Con trỏ không tương thích". (Xin lỗi để viết điều này ở đây, tôi không có đủ tiếng để bình luận).

Các vấn đề liên quan