5

所以我在玩一些直到运行时才知道 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);
}

这显然是我正在尝试做的一个人为的例子。关键是这永远不会起作用,因为“arg”类总是显示为 NSCFNumber,我想不出一种方法来检查它。

有什么方法可以减少检测数组中的任意值是否为整数的混淆?


更新: 感谢@chuck、@omz 和@Nikita Leonov 的帮助。我最初在这里发布的内容只是对我遇到的问题的简化,并在没有先运行它的情况下将其写在这里。该代码一旦更新以消除错误(见下文)实际上运行良好。

我在实际代码中犯的错误同样愚蠢——我将数组传回“doWhatever”而不是数组索引处的项目,这就是我遇到问题的原因。

感谢您尝试提供帮助,但我的问题被误导了。很抱歉浪费了大家的时间!

更正了按需要运行的代码:


- (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);
}
4

1 回答 1

10

NSCFNumber 是 NSNumber 的子类。只要您使用isKindOfClass:而不是isMemberOfClass:or [arg class] == [NSNumber class],它应该可以工作。如果没有,你的问题在别处。

于 2011-08-08T16:30:31.873 回答