2013-08-22 37 views
1

为什么[MyClass class]未能在谓词中找到我想要的类的对象,而[myObject class]的作用是?看下面的代码示例。我希望能够在一个集合中找到MyClass类型的对象,而不需要具有该类的虚假实例。NSPredicate isKindOfClass只适用于[myObject类]不适用于[MyClass class]

MyClass* myObject = [[MyClass alloc] init]; 

这不工作...

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [MyClass class]]; 
NSArray* predicateResults = [mySet filteredSetUsingPredicate:predicate].allObjects; 

这不工作...

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [myObject class]]; 
NSArray* predicateResults = [mySet filteredSetUsingPredicate:predicate].allObjects; 

回答

12

[NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [MyClass class]] 

的谓词实际工作。它返回完全相同的谓词的(记录)

[NSComparisonPredicate 
    predicateWithLeftExpression:[NSExpression expressionForEvaluatedObject] 
       rightExpression:[NSExpression expressionForConstantValue:[MyClass class]] 
       customSelector:@selector(isMemberOfClass:)] 

你的情况的问题可能是isMemberOfClass: 比较了类平等,所以这将不匹配这是一个子类的成员 对象MyClass

如果MyClass是一个类簇,并且myObject是具体子类的实例 ,则可能发生这种情况。例如:

NSString *myString = [[NSString alloc] initWithUTF8String:"hello world"]; 
Class c1 = [NSString class]; // NSString 
Class c2 = [myString class]; // __NSCFString 

BOOL b1 = [myString isMemberOfClass:c1]; // NO 
BOOL b2 = [myString isMemberOfClass:c2]; // YES 

在这种情况下[myObject class][MyClass class]是不同的,这可以解释为什么 一个谓语工作和其他谓词不起作用。

下面的代码使用isKindOfClass:代替,并产生预期的结果:

NSArray *array = @[@"123", @456, [NSArray array]]; 
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [NSNumber class]]; 
NSArray* predicateResults = [array filteredArrayUsingPredicate:predicate]; 
NSLog(@"%@", predicateResults); 
// Output: (456) 
+0

当我看到你的编辑时,刚刚在文档中发现了'predicateWithLeftExpression:rightExpression:customSelector:':)。但是,这对于'predicateWithFormat:'方法没有很好的记录。 –

+0

@GuillaumeAlgis:是的,不幸的是,“谓词编程指南”并未涵盖所有方面。另一个几乎没有记录的重要话题是“SUBQUERY”。 –

+0

“在这种情况下[myObject类]和[MyClass类]是不同的”为什么'[myObject类]'和'[MyClass类]'会不同? – newacct

3

不是严格意义上的回答您的问题(见MartinR出色答卷)但替代(IMO)文件predicateWithFormat:方法:

您可以使用predicateWithBlock:创建您的NSPredicate,如下所示:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
    return [evaluatedObject isKindOfClass:[myClass class]]; 
}]; 

这应该很好。

+0

不用于核心数据请求 – klefevre

+0

我@klefevre工程工作。 – Andy

+0

@Andy使用NSFetchRequest或简单的NSManagedObjects集合? – klefevre

相关问题