objective-c - 参数是 KindOfClass : [NSNumber class] - sane way to check this?

标签 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 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/

相关文章:

ios - 动画时 UIView 不动

iphone - 在 cocoa touch 中实现基于触摸的旋转

ios - 数组或 CGImageRef 的内存泄漏

objective-c - 检查 NSArray 是否包含一些 int

iphone - iOS 我可以增加一个 NSNumber,还是需要创建一个新的?

ios - 使用 NSDictionary 发送 TRUE/FALSE 值,但不使用 NSNumber 类

ios - 如何将 NSDictionary 中的对象添加到 UIActionSheet UIButton 列表的 NSArray

Java不允许调用泛型类型的递归方法?

typescript - 如何在 TypeScript 中检查运行时的对象类型?

c - 我应该使用什么 C 类型来计算内存中的对象?