为什么@(NO)不是NSNumber类

时间:2014-02-07 16:40:51

标签: objective-c class types boolean

我有一种奇怪的行为,似乎是由于iOS中的一些实习烹饪。

当我这样做时:

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

但是@(YES)可以很好地运作。

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

答案:

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

3 个答案:

答案 0 :(得分:5)

只需使用@NO@YES代表NSNumberNO的{​​{1}}个实例。

YES[@(NO) class]都会[@(YES) class]

而且__NSCFBoolean[@NO class]也会给[@YES class]

在所有四种情况下,针对__NSCFBoolean的检查都返回true。

答案 1 :(得分:1)

输出为'number'和'number'。所以他们两个都是NSNumber。

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

答案 2 :(得分:1)

您所做的是盒装表达 语法:

@( <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:@":"];