参数isKindOfClass:[NSNumber class] - 理智的方式检查这个?

时间:2011-08-08 03:51:50

标签: objective-c types nsnumber objective-c-runtime dynamic-typing

所以我玩的是arg的类类型在运行时未知的东西。 像这样:

- (NSNumber *)doWhatever:(id)arg
{
    // this ALWAYS FAILS
    if ([arg isKindOfClass:[NSNumber class]]) {
        return arg;
    }
    else {
        // what was it???
        NSLog("arg klass=%@", [arg class]);  // prints NSCFNumber
    }

    // This check works correctly.
    if ([arg isKindOfClass:[NSArray class]]) {
        for (id x in arg) {
            NSNumber *result = [self doWhatever:x];
            if (result) {
                return result;
            }
        }
    }
    return nil;
}

- (void)someMethod
{
    NSArray *myArray = [NSArray arrayFromObjects:[NSNumber numberWithInt:3], nil]];
    NSNumber *myNum = [self doWhatever:myArray];
    NSLog(@"myNum=%@", myNum);
}

这显然是我正在尝试做的一个人为的例子。 关键是这永远不会工作b / c“arg”的类总是显示为NSCFNumber,我无法找到检查它的方法。

任何方法都可以减少检测数组中的任意值是否为整数的问题?

谢谢, 杰米


更新 嗨,大家好。感谢@chuck,@ omz和@Nikita Leonov的帮助。我最初发布的内容只是对我遇到的问题的简化,并在此处编写而不先运行它。该代码一旦更新以删除错误(见下文)实际上运行正常。

我在我的真实代码中遇到的错误是我同样很傻 - 我把数组传回“doWhatever”而不是数组索引处的项目,这就是我遇到问题的原因。 / p>

感谢您试图提供帮助,但是我的问题被误导了...... 很抱歉浪费每个人的时间!

杰基

更正了根据需要运行的代码:


- (NSNumber *)doWhatever:(id)arg
{
    // this NOW WORKS
    if ([arg isKindOfClass:[NSNumber class]]) {
        return arg;
    }
    else {
        // what was it???
        NSLog(@"arg klass=%@", [arg class]);  // prints NSCFNumber
    }

    // This check works correctly.
    if ([arg isKindOfClass:[NSArray class]]) {
        for (id x in arg) {
            NSNumber *result = [self doWhatever:x];
            if (result) {
                return result;
            }
        }
    }
    return nil;
}

- (void)someMethod
{
    NSArray *myArray = [NSArray arrayWithObjects:
                        [NSNumber numberWithInt:1],
                        [NSNumber numberWithInt:2],
                        [NSNumber numberWithInt:3],
                        [NSNumber numberWithInt:4],
                        nil];
    NSNumber *myNum = [self doWhatever:myArray];
    NSLog(@"myNum=%@", myNum);
}

1 个答案:

答案 0 :(得分:10)

NSCFNumber是NSNumber的子类。只要您使用的是isKindOfClass:而不是isMemberOfClass:[arg class] == [NSNumber class],它就可以正常使用。如果没有,你的问题就在其他地方。