2012-06-16 49 views
17

tôi có một đối tượng từ một lớp NSObject mà tôi gọi là "thương hiệu" và có các thuộc tính sau:iOS - Tìm một đối tượng phức tạp trong một mảng

.name 
.number 
.site 

tại một thời điểm nhất định, hàng chục các đối tượng được lưu trữ trên NSMutableArray, giống như:

object 1 
object 2 
object 3 
object 4 
... 

Tôi muốn có thể truy xuất một đối tượng nhất định từ mảng theo số của nó. Không phải chỉ mục của đối tượng trên mảng nhưng thuộc tính số của đối tượng (lấy đối tượng có thuộc tính số bằng 10, ví dụ).

Tôi biết rằng NSArrays có các phương pháp thông minh để truy xuất nội dung nhưng tôi không biết chúng sâu sắc vì tôi hiếm khi sử dụng. Có cách nào để lấy đối tượng đó từ mảng mà không cần phải iterate qua tất cả các đối tượng trên mảng và kiểm tra tài sản số của mỗi đối tượng?

Các bạn có thể trợ giúp không? cảm ơn.

Trả lời

15

Tôi muốn giới thiệu NSPredicate. Bạn có thể làm điều đó với một cái gì đó như thế này, giả sử listOfItems là mảng của bạn có chứa NSObject của bạn với các thuộc tính đã nói.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"number == 10"]; 
NSArray *filtered = [listOfItems filteredArrayUsingPredicate:predicate]; 

kết quả được lọc của bạn, bất kỳ số phù hợp với 10 bây giờ sẽ có trong mảng filtered. Nếu bạn muốn quay trở lại đối tượng của mình, bạn có thể làm như sau:

YourObject *object = (YourObject*)[filtered objectAtIndex:0]; 

Hy vọng điều này sẽ hữu ích.

12
NSUInteger indexOfObject10 = [myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
    MyObject *object = (MyObject *)obj; 
    return [object.number == 10]; 
}]; 

MyObject *object10 = myArray[indexOfObject10]; 
0

Có lẽ một cái gì đó như thế này:

NSObject *retrieveObject = [[NSObject alloc] init]; 
retrieveObject.number = 1; 

NSObject *anObject = [yourMutableArray objectAtIndex:[yourMutableArray indexOfObjectIdenticalTo:testObject]]; 

Trước tiên, tôi tạo ra một đối tượng với số lượng tương tự như một đối tượng trong mảng mà tôi muốn lấy (trong trường hợp này "1"). Trong dòng tiếp theo, tôi giả định rằng khi bạn lấy nó, bạn muốn gán giá trị của nó cho một đối tượng khác, vì vậy tôi lấy nó bằng cách sử dụng phương thức tiêu chuẩn objectAtIndex: với tham số chỉ mục là phương thức khác, phương thức indexOfObjectIdenticalTo:, với tham số của phương thức đó là retriveObject đối tượng. Vì vậy, điều này có vẻ là trong mảng cho đối tượng đầu tiên giống hệt với retrieveObject (có nghĩa là chúng có cùng số) và trả về chỉ mục của đối tượng đó và sau đó chuyển giá trị đó vào phương thức objectAtIndex.

Hy vọng điều này sẽ hữu ích!

1

Tôi thích sử dụng tiện ích mở rộng khối hơn cho NSArray cho phép bạn "nói chuyện" với họ một cách tự nhiên hơn và viết ít mã hơn. Một cái gì đó trong các dòng của thuật ngữ Smalltalk Bộ sưu tập:

  • phát hiện:
  • chọn:
  • bơm: thành:
  • , vv

Trong trường hợp của bạn tôi sẽ sử dụng:

MyObject* theObject = [myArray detect:^(MyObject* each){ 
    return each.number == 10; 
}]; 

Ở đây bạn có thể thực hiện gia hạn đó để NSArray

typedef BOOL (^BlockPredicate) (id element); 

-(id) detect:(BlockPredicate) predicateBlock{ 
    for (id each in self) { 
     if (predicateBlock(each)) { 
      return each; 
     } 
    } 
    return nil; 
} 

tôi thấy loại này của các công cụ thực sự hữu ích. Tôi hy vọng bạn cũng thấy chúng hữu ích.

+0

điều gì xảy ra nếu mảng chứa nhiều đối tượng có cùng số? – SpaceDog

+1

Việc triển khai này sẽ 'phát hiện' và trả lại kết quả đầu tiên. Nếu bạn muốn tìm tất cả các trường hợp có cùng số, bạn có thể sử dụng chọn :. – Lio

+0

OK. Cảm ơn lời giải thích! – SpaceDog

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