jps*_*ain 5 types objective-c objective-c-runtime dynamic-typing nsnumber
所以我玩的是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);
}
Run Code Online (Sandbox Code Playgroud)
这显然是我正在努力做的一个人为的例子.关键是这永远不会工作b/c"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);
}
Run Code Online (Sandbox Code Playgroud)
Chu*_*uck 10
NSCFNumber是NSNumber的子类.只要你使用isKindOfClass:而不是isMemberOfClass:或[arg class] == [NSNumber class],它应该工作.如果没有,你的问题在其他地方.