аргумент isKindOfClass: [NSNumber class] - разумный способ проверить это?

Итак, я играл с чем-то, где тип класса аргумента неизвестен до времени выполнения. вот так:

- (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 и @ Никите Леонову за вашу помощь. То, что я разместил здесь изначально, было просто упрощением проблемы, с которой я столкнулся, и написал ее здесь, не запустив ее предварительно. Этот код, когда-то обновленный для удаления ошибок (см. Ниже), на самом деле работает нормально.

Ошибка, которую я допустил в моем реальном коде, с которым у меня были проблемы, была столь же глупой - вместо этого я передавал массив обратно в "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);
}
5
задан jpswain 8 August 2011 в 23:55
поделиться