5

所以我玩的东西的类的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); 
} 
+1

你确定以这种方式构建数组吗?我写了下面的代码,isKindOfClass在这种情况下效果很好: NSNumber * number = [NSNumber numberWithFloat:0.5]; ([number isKindOfClass:[NSNumber class]]){ NSLog(@“NSNumebr”); } –

+1

检查数组的初始化如“someMethod to os”中所示,也可按照isKindOfClass调用的预期工作 –

+1

您真的使用了这个确切的代码吗?没有'arrayFromObjects:'方法,它被称为'arrayWithObjects:'。它应该工作并打印'NSCFArray'(或类似的东西)而不是'NSCFNumber'。 – omz

回答

10

NSCFNumber是NSNumber的的一个子类。只要您使用isKindOfClass:而不是isMemberOfClass:[arg class] == [NSNumber class],它应该可以工作。如果不是,你的问题在别处。