所以我在玩一些直到运行时才知道 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);
}
最佳答案
NSCFNumber 是 NSNumber 的子类。只要您使用的是 isKindOfClass:
而不是 isMemberOfClass:
或 [arg class] == [NSNumber class]
,它就应该可以工作。如果不是,则您的问题出在其他地方。
关于objective-c - 参数是 KindOfClass : [NSNumber class] - sane way to check this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6977570/