2011-09-06 44 views

Trả lời

23

Bạn có thể sử dụng các khối dựa liệt kê để làm điều này là tốt.

// This will eventually contain the index of the object. 
// Initialize it to NSNotFound so you can check the results after the block has run. 
__block NSInteger foundIndex = NSNotFound; 

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([obj isKindOfClass:[MyClass class]]) { 
     foundIndex = idx; 
     // stop the enumeration 
     *stop = YES; 
    } 
}]; 

if (foundIndex != NSNotFound) { 
    // You've found the first object of that class in the array 
} 

Nếu bạn có nhiều đối tượng thuộc loại lớp này trong mảng của mình, bạn sẽ phải chỉnh sửa ví dụ một chút, nhưng điều này sẽ cho bạn biết bạn có thể làm gì.

Lợi thế của việc liệt kê nhanh hơn này là nó cho phép bạn cũng trả về chỉ mục của đối tượng. Ngoài ra nếu bạn đã sử dụng enumerateObjectsWithOptions:usingBlock:, bạn có thể đặt các tùy chọn để tìm kiếm đồng thời, do đó bạn sẽ nhận được liệt kê luồng miễn phí hoặc chọn tìm kiếm mảng ngược lại hay không.

API dựa trên khối linh hoạt hơn. Mặc dù chúng trông mới và phức tạp, chúng rất dễ nhận khi bạn bắt đầu sử dụng chúng - và sau đó bạn bắt đầu thấy cơ hội sử dụng chúng ở mọi nơi.

+0

Lợi thế khi sử dụng phương pháp dựa trên khối, ngoài việc có thể chỉ định biến để ngừng liệt kê là gì? – futureelite7

+0

Tôi sẽ sử dụng NSNotFound thay vì -1. – NSResponder

+0

@NSResponder - Tốt bắt - cảm ơn. – Abizern

7

Bạn có thể sử dụng liệt kê nhanh để lặp qua mảng và kiểm tra các lớp:

BOOL containsClass = NO; 

for (id object in array) { 
    if ([object isKindOfClass:[MyClass class]]) { 
     containsClass = YES; 
     break; 
    } 
} 
8

Bạn có thể thực hiện việc này bằng NSPredicate.

NSPredicate *p = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", 
                 [NSNumber class]]; 
NSArray *filtered = [identifiers filteredArrayUsingPredicate:p]; 
NSAssert(filtered.count == identifiers.count, 
     @"Identifiers can only contain NSNumbers."); 
Các vấn đề liên quan