Objective c 使用相同类型的输入再次调用私有方法无法编译

Objective c 使用相同类型的输入再次调用私有方法无法编译,objective-c,compiler-errors,Objective C,Compiler Errors,我在类中定义了一个NS_枚举: typedef NS_ENUM (NSUInteger, SIOPredicateType) { SIOPredicateTypeEqualTo, SIOPredicateTypeNotEqualTo, SIOPredicateTypeGreaterThan, SIOPredicateTypeGreaterThanOrEqualTo, SIOPredicateTypeLessThan, SIOPredicateTypeLessT

我在类中定义了一个NS_枚举:

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:@[]];