2009-09-17 31 views
50

Tôi có một số NSArray được tạo thành với các đối tượng của một lớp tùy chỉnh. Lớp này có 3 thuộc tính chuỗi (thành phố, tiểu bang, zip). Tôi muốn nhận tất cả các giá trị trạng thái duy nhất từ ​​array.iPhone - nhận các giá trị duy nhất từ ​​đối tượng NSArray

Tôi đã đọc qua lớp NSPredicate nhưng không thể tận dụng tối đa cách sử dụng trong trường hợp này. Các ví dụ duy nhất tôi có thể tìm thấy là cho các hoạt động chuỗi.

Ai đó có thể giúp tôi không?

Trả lời

117

Các hoàn toàn đơn giản lót:

NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]]; 

Bí quyết là phương pháp valueForKey: của NSArray. Điều đó sẽ lặp qua mảng của bạn (myArrayOfCustomObjects), gọi phương thức -state trên mỗi đối tượng và tạo một mảng kết quả. Sau đó, chúng tôi tạo một NSSet với mảng kết quả của các trạng thái để loại bỏ các bản sao.


Bắt đầu với iOS 5 và OS X 10.7, có một lớp mới có thể thực hiện điều này: NSOrderedSet. Lợi thế của một tập hợp đặt hàng là nó sẽ loại bỏ bất kỳ bản sao nào, nhưng cũng duy trì thứ tự tương đối.

NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"]; 
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states]; 
NSSet *uniqueStates = [orderedSet set]; 
+0

Trong khi tôi cũng như sức mạnh của @distinctUnionOfObjects, và do đó, người dùng trả lời probablyCorey tặng, lợi ích với cách tiếp cận ngắn gọn này ở đây trong dung dịch này là thứ tự được giữ nguyên. – idStar

134

Hãy xem keypaths. Chúng rất mạnh và tôi sử dụng chúng thay vì các lớp học NSPredicate hầu hết thời gian. Đây là cách bạn sẽ sử dụng chúng trong ví dụ của bạn ...

NSArray *uniqueStates; 
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"]; 

Lưu ý việc sử dụng valueForKeyPath thay vì valueForKey.

Đây là một/example giả tạo chi tiết hơn ...

NSDictionary *arnold = [NSDictionary dictionaryWithObjectsAndKeys:@"arnold", @"name", @"california", @"state", nil]; 
NSDictionary *jimmy = [NSDictionary dictionaryWithObjectsAndKeys:@"jimmy", @"name", @"new york", @"state", nil]; 
NSDictionary *henry = [NSDictionary dictionaryWithObjectsAndKeys:@"henry", @"name", @"michigan", @"state", nil]; 
NSDictionary *woz = [NSDictionary dictionaryWithObjectsAndKeys:@"woz", @"name", @"california", @"state", nil]; 

NSArray *people = [NSArray arrayWithObjects:arnold, jimmy, henry, woz, nil]; 

NSLog(@"Unique States:\n %@", [people valueForKeyPath:@"@distinctUnionOfObjects.state"]); 

// OUTPUT 
// Unique States: 
// "california", 
// "michigan", 
// "new york" 
+17

Lưu ý: valueForKeyPath: @ "@ distinctUnionOfObjects.PROPERTY" không giữ thứ tự sắp xếp. –

+0

cảm ơn @RobertAltman, vì đã chỉ ra điều đó. Tôi đoán rằng đã tiết kiệm cho tôi một số thời gian gỡ lỗi – Hulvej

+0

Điều gì nếu đối tượng chìa khóa là một mảng và giá trị tồn tại trên chỉ mục đầu tiên của nó? –

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