我有一种奇怪的行为,似乎是由于iOS中的一些实习烹饪。
当我这样做时:
id data1 = @(NO);
if ([data1 isKindOfClass:[NSNumber class]]) {
// doesn't come here.
}
但是@(YES)
可以很好地运作。
首先,我想了解原因。其次,我想知道你会怎么做? (因为id也可以是文本)。
答案:
确实,@(NO)是一类NSNumber,我的问题是由于其他一些错误。
答案 0 :(得分:5)
只需使用@NO
和@YES
代表NSNumber
和NO
的{{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:@":"];