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