Objective c 如何使用谓词从NSArray获取唯一对象?
如何使用谓词从Objective c 如何使用谓词从NSArray获取唯一对象?,objective-c,Objective C,如何使用谓词从NSArray获取唯一对象?在以下情况下,结果应为typeA和typeD 类的接口MyType: @interface MyType : NSObject @property NSString *name; @property NSString *identifier; @end 类的接口MyTask: @interface MyTask : NSObject @property MyType *type @end 示例代码: // type objects MyTy
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];
您是否尝试过:
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF.type==%@", typeD];
NSArray* array = [tasks filteredArrayUsingPredicate:predicate];
数组
对象应包含一个对象:task3
。这还假设您也有类型
getter,而不仅仅是setter(setType
)。您可以使用@distinctUnionOfObjects
。就你而言
[tasks valueForKeyPath:@"@distinctUnionOfObjects.type"]
返回包含元素typeA
和typeD
(不一定按该顺序)的数组,
及
返回一个数组,其中包含字符串
“A”
和“D”
这是否需要OP在MyType中实现hash或compareMyType:才能工作?@WarrenBurton:这取决于。isEqual的默认实现(从NSObject继承)比较指针。只有在这还不够的情况下(例如,如果两个不同的MyType对象具有相同的标识符,则应将其视为相等),才必须重写它。
[tasks valueForKeyPath:@"@distinctUnionOfObjects.type.name"]