如何使用谓词从NSArray获取唯一对象?

时间:2014-05-17 01:39:30

标签: objective-c

如何使用谓词从NSArray获取唯一对象?在下面的情况中,结果应为typeAtypeD

班级MyType的接口:

@interface MyType : NSObject

@property NSString *name;
@property NSString *identifier;

@end

班级MyTask的接口:

@interface MyTask : NSObject 

@property MyType *type

@end

示例代码:

// type objects
MyType *typeA = [[MyType alloc] init];
[typeA setName:@“A”];
[typeA setIdentifier:@“A”];

MyType *typeB = [[MyType alloc] init];
[typeB setName:@“B”];
[typeB setIdentifier:@“B”];

MyType *typeC = [[MyType alloc] init];
[typeC setName:@“C”];
[typeC setIdentifier:@“C”];

MyType *typeD = [[MyType alloc] init];
[typeD setName:@“D”];
[typeD setIdentifier:@“D”];

// task objects
MyTask *task1 = [[MyTask alloc] init];
[task1 setType:typeA];

MyTask *task2 = [MyTask alloc] init];
[task2 setType:typeA];

MyTask *task3 = [[MyTask alloc] init];
[task3 setType:typeD];

MyTask *task4 = [[MyTask alloc] init];
[task4 setType:typeA];

NSArray *tasks = @[task1, task2, task3, task4];

2 个答案:

答案 0 :(得分:1)

您可以使用Key-Value Coding collection operator @distinctUnionOfObjects。在你的情况下,

[tasks valueForKeyPath:@"@distinctUnionOfObjects.type"]

返回一个包含元素typeAtypeD的数组(不一定按此顺序), 和

[tasks valueForKeyPath:@"@distinctUnionOfObjects.type.name"]

返回一个包含字符串"A""D"的数组。

答案 1 :(得分:0)

你试过了吗?

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF.type==%@", typeD];
NSArray* array = [tasks filteredArrayUsingPredicate:predicate];

array对象应包含一个对象:task3。这也假设你有type getter,而不仅仅是setter(setType)。