【问题标题】:Why @(NO) isn't kind of class NSNumber [closed]为什么@(NO) 不是类 NSNumber [关闭]
【发布时间】:2014-02-07 16:40:51
【问题描述】:

我有一个奇怪的行为,这似乎是由于 iOS 中的一些实习生烹饪造成的。

当我这样做时:

id data1 = @(NO);
if ([data1 isKindOfClass:[NSNumber class]]) {
    // doesn't come here.
}

但是使用@(YES) 可以完美运行。

首先我想了解原因。其次,我想知道您在我的情况下会怎么做? (因为 id 也可以是文本)。

答案:

确实,@(NO) 是一个类 NSNumber,我的问题是由于其他一些错误。

【问题讨论】:

  • 那是您的确切代码吗?我无法重现该问题。
  • 不是,实际上我的值存储在NSDictionary 中,然后我用mydict[@"data1"] 提取它,我通过一个要求id 类型的方法传递它,然后我做我的[data1 isKindOfClass:[NSNumber class]]。我只是不想复制整个内容,但我想NSDictionnary 确实会产生影响。
  • 那么你应该 NSLog mydict[@"data1"] 实际返回的内容。它可能是nil,或者是一个字符串或其他不是数字的东西。
  • 我这样做了NSLog(@"%@ -- %@ (%@ || %@)", data1, data2, [data1 class], [data2 class]); 它返回了我0 -- 1 (__NSCFBoolean || __NSCFBoolean)。当data1为@(NO)且data2为@(YES)@NO@YES时。
  • 好的,我看到我的错误在其他地方。但是我学到了很多东西,谢谢大家! :)

标签: objective-c class types boolean


【解决方案1】:

只需将@NO@YES 用于代表NOYESNSNumber 实例。

[@(NO) class][@(YES) class] 都给 __NSCFBoolean

还有[@NO class][@YES class] 也提供__NSCFBoolean

在所有四种情况下,对 isKindOfClass:[NSNumber class] 的检查均返回 true。

【讨论】:

  • 我确实使用过,但确实是一样的结果。 __NSCFBoolean 看起来不错,但我想我不能使用它,因为它应该是私有 API 的一部分,不是吗?
  • @NO@(NO) 返回相同的对象,所以这应该没有区别。 [data1 isKindOfClass:[NSNumber class]] 确实为我返回 YES ...
  • 我相信__NSCFBooleanNSNumber 的私有子类,因此当您检查isKindOfClass: 以查看它是否为NSNumber 时,它应该始终返回YES。但是,如果您使用isMemberOfClass:,它将返回NO,因为它不是那个确切的类。 Apple 在其框架中使用了很多私有子类。
  • 我评论了我的问题以获取更多详细信息。
  • @MartinR 我在确认几件事后更新了答案。谢谢。
【解决方案2】:

对我来说,输出是“数字”和“数字”。所以他们都是NSNumber。

    id no = @(NO);
    id yes = @(YES);
    if ([no isKindOfClass:[NSNumber class]]) {
        NSLog(@"number");
    }if ([yes isKindOfClass:[NSNumber class]]) {
        NSLog(@"number");
    }

【讨论】:

    【解决方案3】:

    您所做的称为盒装表达式 语法:

    @( <expression> )
    

    如果你想要NSNumber 值当然应该使用@YES@NO,就像@maddy 说的那样。

    但如果您对盒装表达式感兴趣,请查看此示例(来自here):

    // numbers.
    NSNumber *smallestInt = @(-INT_MAX - 1);  // [NSNumber numberWithInt:(-INT_MAX - 1)]
    NSNumber *piOverTwo = @(M_PI / 2);        // [NSNumber numberWithDouble:(M_PI / 2)]
    
    // enumerated types.
    typedef enum { Red, Green, Blue } Color;
    NSNumber *favoriteColor = @(Green);       // [NSNumber numberWithInt:((int)Green)]
    
    // strings.
    NSString *path = @(getenv("PATH"));       // [NSString stringWithUTF8String:(getenv("PATH"))]
    NSArray *pathComponents = [path componentsSeparatedByString:@":"];
    

    【讨论】:

    • 谢谢你教我,我都不认识他们:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多