Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何使用谓词从NSArray获取唯一对象?_Objective C - Fatal编程技术网

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"]