Аргумент isKindOfClass: [NSNumber class] - вменяемый способ проверить это? - PullRequest
5 голосов
/ 08 августа 2011

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

Ошибка, которую я допустил в своем реальном коде, с которым у меня возникли проблемы, была столь же глупой - я передавал массив обратно в "doWh независимо "вместо элемента в индексе массива, вот почему у меня возникли проблемы.

Спасибо за попытку помочь, но заблуждаюсь, но мой вопрос был ... Извините за трату времени всех!

Jamie

Исправленный код, который работает по желанию:


- (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 Ответ

10 голосов
/ 08 августа 2011

NSCFNumber является подклассом NSNumber. Пока вы используете isKindOfClass: вместо isMemberOfClass: или [arg class] == [NSNumber class], это должно работать. Если нет, то ваша проблема в другом месте.

...