Итак, я играл с чем-то, где тип класса аргумента неизвестен до времени выполнения. вот так:
- (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);
}