55

我有NSArray一个自定义类的对象。该类具有 3 个(城市、州、邮编)字符串属性。我想从array.

我确实通读了这NSPredicate门课,但在这种情况下无法充分了解如何使用它。我能找到的唯一例子是字符串操作。

有人可以帮我吗?

4

2 回答 2

136

看看keypaths。它们非常强大,我大部分时间都使用它们而不是 NSPredicate 类。这是您在示例中使用它们的方式...

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

请注意使用valueForKeyPath而不是valueForKey

这是一个更详细/人为的示例...

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"
于 2009-09-17T16:05:06.690 回答
123

完全简单的一个班轮:

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

诀窍是valueForKey:方法NSArray。这将遍历您的数组 ( myArrayOfCustomObjects),调用-state每个对象的方法,并构建一个结果数组。然后,我们使用生成的状态数组创建一个NSSet以删除重复项。


从 iOS 5 和 OS X 10.7 开始,有一个新类也可以做到这一点:NSOrderedSet. 有序集的优点是它会删除任何重复项,但也会保持相对顺序。

NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"];
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states];
NSSet *uniqueStates = [orderedSet set];
于 2009-09-17T15:35:35.783 回答