Ios NSPredicate isKindOfClass仅适用于[myObject class],不适用于[MyClass]

Ios NSPredicate isKindOfClass仅适用于[myObject class],不适用于[MyClass],ios,objective-c,class,nspredicate,Ios,Objective C,Class,Nspredicate,为什么[MyClass]无法在谓词中找到我想要的类的对象,而[myObject class]却可以工作?请参见下面的代码示例。我希望能够在一个集合中找到MyClass类型的对象,而不需要该类的虚假实例 MyClass* myObject = [[MyClass alloc] init]; 这不管用 NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [MyClass cla

为什么
[MyClass]
无法在谓词中找到我想要的类的对象,而
[myObject class]
却可以工作?请参见下面的代码示例。我希望能够在一个集合中找到MyClass类型的对象,而不需要该类的虚假实例

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;

严格来说,这不是对您的问题的回答(请参见MartinR极好的答案),而是(IMO)的另一种替代方法,位于文档化的
predicateWithFormat:
方法下:

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

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return [evaluatedObject isKindOfClass:[myClass class]];
}];
这应该可以正常工作。

类似于

[NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [MyClass class]]
实际上是有效的。它返回与(记录的)完全相同的谓词

您案例中的问题可能是
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]
是不同的,这将解释 为什么一个谓词起作用而另一个谓词不起作用

以下代码使用
isKindOfClass:
代替,并生成预期结果:

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

当我看到您的编辑时,我刚刚在文档中找到了
谓词WithLeftExpression:rightExpression:customSelector:
)。尽管如此,对于
predicateWithFormat:
方法,这一点并没有很好的文档记录。@GuillaumeAlgis:是的,不幸的是,“谓词编程指南”并没有涵盖所有方面。另一个几乎没有记录的重要主题是“子查询”。“在这种情况下,[myObject class]和[MyClass class]是不同的”为什么
[myObject class]
[MyClass]
会不同?@newacct:If
MyClass
是一个类簇而
myObject
是一个具体子类的实例。我已经重写了答案,希望能(希望)弄清楚我的意思。它仍需由OP确认。@Andy With NSFetchRequest或简单的NSManagedObjects集合?@klefevre With NSManagedObjects。这个问题根本不是关于NSFetchRequest。。。
NSArray *array = @[@"123", @456, [NSArray array]];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [NSNumber class]];
NSArray* predicateResults = [array filteredArrayUsingPredicate:predicate];
NSLog(@"%@", predicateResults);
//  Output: ( 456 )