Objective c 使用相同类型的输入再次调用私有方法无法编译
我在类中定义了一个NS_枚举:Objective c 使用相同类型的输入再次调用私有方法无法编译,objective-c,compiler-errors,Objective C,Compiler Errors,我在类中定义了一个NS_枚举: typedef NS_ENUM (NSUInteger, SIOPredicateType) { SIOPredicateTypeEqualTo, SIOPredicateTypeNotEqualTo, SIOPredicateTypeGreaterThan, SIOPredicateTypeGreaterThanOrEqualTo, SIOPredicateTypeLessThan, SIOPredicateTypeLessT
typedef NS_ENUM (NSUInteger, SIOPredicateType) {
SIOPredicateTypeEqualTo,
SIOPredicateTypeNotEqualTo,
SIOPredicateTypeGreaterThan,
SIOPredicateTypeGreaterThanOrEqualTo,
SIOPredicateTypeLessThan,
SIOPredicateTypeLessThanOrEqualTo,
};
在类的私有方法中使用:
- (NSPredicate *) generatePredicateForType: (SIOPredicateType) predicateType withArguments: (NSArray *) arguments {
NSString * operand;
switch (predicateType) {
case SIOPredicateTypeEqualTo: {
operand = @"==";
break;
}
case SIOPredicateTypeNotEqualTo: {
operand = @"!=";
break;
}
case SIOPredicateTypeGreaterThan: {
operand = @">";
break;
}
case SIOPredicateTypeGreaterThanOrEqualTo: {
operand = @">=";
break;
}
case SIOPredicateTypeLessThan: {
operand = @"<";
break;
}
case SIOPredicateTypeLessThanOrEqualTo: {
operand = @"<=";
break;
}
default: {
[NSException raise: SIOQueryExceptionInvalidPredicateType format:@"An invalid predicate type was passed to this method."];
break;
}
}
NSString * predicateFormat = [NSString stringWithFormat: @"key %@ value", operand];
return [NSPredicate predicateWithFormat: predicateFormat argumentArray: arguments];
}
我的问题是第一条消息发送成功,但第二条消息失败,并出现隐式转换错误。我的问题是为什么它会在第二次失败而不是第一次失败。如果我自己调用第一个方法,测试就会通过。如果我添加另一个方法调用(即使使用不同的
SIOPredicateType
),它也会失败。这很微妙。由于无法将nsuiger
值(您的enum
类型)传递给withObject:
参数,因此这两种方法都不起作用
定义枚举时,将为每个枚举值指定下一个以0
开头的整数值。这意味着sioPredicateTypeQualto
enum值的值为0
因此,第一个调用实际上编译为:
NSPredicate * testEqualToPredicate = [testQuery performSelector: @selector(generatePredicateForType:withArguments:)
withObject:0
withObject:@[]];
值为0
的对象指针与nil
相同。所以你真的在编译:
NSPredicate * testEqualToPredicate = [testQuery performSelector: @selector(generatePredicateForType:withArguments:)
withObject:nil
withObject:@[]];
这就是它编译的原因
在运行时,nil
值在generatePredicateForType:withArguments:
方法中被解释为第一个参数的0
。这将导致调用该方法,但仅适用于这种特殊情况
第二次尝试使用枚举值
SIOPredicateTypeNotEqualTo
无法正确编译,因为您正在将一个非零的nsInteger
值传递给一个需要id
(对象引用)参数值的参数。以及后续问题“那么正确的方法是什么?”,感谢您的全面回复!这很有帮助,考虑到我得到的隐式转换警告错误,这是有意义的。
NSPredicate * testEqualToPredicate = [testQuery performSelector: @selector(generatePredicateForType:withArguments:)
withObject:nil
withObject:@[]];