为什么 [MyClass class]
无法在谓词中找到我想要的类的对象,而 [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;
最佳答案
像这样的谓词
[NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [MyClass class]]
确实有效。它返回与(记录的)完全相同的谓词
[NSComparisonPredicate
predicateWithLeftExpression:[NSExpression expressionForEvaluatedObject]
rightExpression:[NSExpression expressionForConstantValue:[MyClass class]]
customSelector:@selector(isMemberOfClass:)]
您的问题可能是 isMemberOfClass:
比较类 equality,所以这不会匹配作为成员的对象
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 )
关于ios - NSPredicate isKindOfClass 仅适用于 [myObject class] 不适用于 [MyClass class],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18377593/