如何使用谓词从NSArray
获取唯一对象?在下面的情况中,结果应为typeA
和typeD
。
班级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];
答案 0 :(得分:1)
您可以使用Key-Value Coding collection operator @distinctUnionOfObjects
。在你的情况下,
[tasks valueForKeyPath:@"@distinctUnionOfObjects.type"]
返回一个包含元素typeA
和typeD
的数组(不一定按此顺序),
和
[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
)。