Objective c 参数有点类:[NSNumber类]-检查这一点的合理方法?

Objective c 参数有点类:[NSNumber类]-检查这一点的合理方法?,objective-c,types,nsnumber,objective-c-runtime,dynamic-typing,Objective C,Types,Nsnumber,Objective C Runtime,Dynamic Typing,所以我在玩一个直到运行时arg的类类型都是未知的东西。 像这样: - (NSNumber *)doWhatever:(id)arg { // this ALWAYS FAILS if ([arg isKindOfClass:[NSNumber class]]) { return arg; } else { // what was it??? NSLog("arg klass=%@", [arg c

所以我在玩一个直到运行时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);
}
这显然是我试图做的一个人为的例子。 关键是这永远不起作用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);
}

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

您确定要以这种方式构建阵列吗?我编写了以下代码,一个Iskindof类在这种情况下运行良好:NSNumber*number=[NSNumber numberWithFloat:0.5];如果([number isKindOfClass:[NSNumber class]]){NSLog(@“NSNumebr”);}检查了数组的初始化,如您的“操作系统的某些方法在isKindOfClass调用中也能正常工作。您真的使用了这段代码吗?”?没有
arrayFromObjects:
方法,它被称为
arrayWithObjects:
。除此之外,它应该工作并打印
NSCFArray
(或类似内容),而不是
NSCFNumber