参数 isKindOfClass: [NSNumber class] - 检查这个的合理方法吗?

发布于 2024-11-28 06:39:54 字数 2080 浏览 3 评论 0原文

所以我正在玩一些直到运行时 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);
}

So I was playing with something where the class type of the arg is unknown until runtime.
like this:

- (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);
}

This is obviously a contrived example of what I'm trying to do.
The point is this never works b/c the class of "arg" always appears as NSCFNumber, and I can't figure out a way to check for that.

Any way to make it less confusing to detect whether an arbitrary value in an array is an integer or not?


UPDATE:
Thanks @chuck, @omz, and @Nikita Leonov for your help. What I posted here originally was just a simplification of the problem I was having and wrote it here without running it first. That code once updated to remove the errors (see below) runs fine actually.

The mistake I made in my real code that I was having trouble with was equally silly--I was passing the array back in to "doWhatever" instead of the item at array's index, which is why I was having problems.

Thanks for trying to help, however misguided my question was.
Sorry for wasting everybody's time!

Corrected code that runs as desired:


- (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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

笨死的猪 2024-12-05 06:39:54

NSCFNumber 是 NSNumber 的子类。只要您使用 isKindOfClass: 而不是 isMemberOfClass:[arg class] == [NSNumber class],它就应该可以工作。如果没有,那么你的问题出在其他地方。

NSCFNumber is a subclass of NSNumber. As long as you're using isKindOfClass: rather than isMemberOfClass: or [arg class] == [NSNumber class], it should work. If not, your problem is elsewhere.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文