所以我玩的东西的类的arg是未知的,直到运行时。 这样的:参数isKindOfClass:[NSNumber类] - 理智的方法来检查这个?
- (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);
}
这显然是我想要做一个人为的例子。 关键是这永远不会工作b/c“arg”的类始终显示为NSCFNumber,我无法找出一种方法来检查。
任何方式可以减少检测数组中的任意值是否为整数的混淆?
感谢, 杰米
UPDATE: 嗨,大家好。谢谢@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);
}
你确定以这种方式构建数组吗?我写了下面的代码,isKindOfClass在这种情况下效果很好: NSNumber * number = [NSNumber numberWithFloat:0.5]; ([number isKindOfClass:[NSNumber class]]){ NSLog(@“NSNumebr”); } –
检查数组的初始化如“someMethod to os”中所示,也可按照isKindOfClass调用的预期工作 –
您真的使用了这个确切的代码吗?没有'arrayFromObjects:'方法,它被称为'arrayWithObjects:'。它应该工作并打印'NSCFArray'(或类似的东西)而不是'NSCFNumber'。 – omz