ios - NSPredicate isKindOfClass 仅适用于 [myObject class] 不适用于 [MyClass class]

标签 ios objective-c class nspredicate

为什么 [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/

相关文章:

android - 获取 iOS 和 Android 设备之间的相同时间

ios - 访问无值(value)的隐式解包可选?

iOS:使用 Amazon SNS 以编程方式从应用触发推送通知

ios - 如果没有互联网,防止应用程序崩溃

javascript - 更好的方法来处理 JavaScript 类中的状态变化

c++ - 具有枚举返回类型的函数无法在 C++ 类中解析

ios - 是否可以像在 Vuforia 中那样在 ARKit 中跟踪对象?

ios - swift 音频套件 : How to build an VCO who's pitch is controlled by an AR-envelope?

objective-c - NSDictionary 的唯一键和唯一值的任何替代方案?

c++ - 异构数组中的元素可以知道它是什么模板类型吗?