NSPredicate isKindOfClass仅适用于[myObject类]而不适用于[MyClass类]

Bob*_*byG 2 class objective-c nspredicate ios

为什么[MyClass class]在谓词中找不到我想要的类的对象却[myObject class]有效呢?请参阅下面的代码示例 我希望能够在一个集合中找到MyClass类型的对象,而不需要有可用的类的虚假实例.

MyClass* myObject = [[MyClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

这不起作用......

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [MyClass class]];
NSArray* predicateResults = [mySet filteredSetUsingPredicate:predicate].allObjects;
Run Code Online (Sandbox Code Playgroud)

这确实有效......

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [myObject class]];
NSArray* predicateResults = [mySet filteredSetUsingPredicate:predicate].allObjects;
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 14

像谓词一样

[NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [MyClass class]]
Run Code Online (Sandbox Code Playgroud)

实际上有效.它返回与(记录的)完全相同的谓词

[NSComparisonPredicate
    predicateWithLeftExpression:[NSExpression expressionForEvaluatedObject]
                rightExpression:[NSExpression expressionForConstantValue:[MyClass class]]
                 customSelector:@selector(isMemberOfClass:)]
Run Code Online (Sandbox Code Playgroud)

你的情况下的问题可能是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
Run Code Online (Sandbox Code Playgroud)

在那种情况下[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 )
Run Code Online (Sandbox Code Playgroud)