iphone – 检查NSNumber是否为空 - 代码日志

iphone – 检查NSNumber是否为空

如何检查NSNumber对象是否为空或空?

OK nil很容易:

NSNumber *myNumber;
if (myNumber == nil)
    doSomething

但是如果对象已经被创建,但是由于分配失败,它没有任何价值,所以我该如何检查?使用这样的东西

if ([myNumber intValue]==0)
   doSomething

有空的空间测试对象的一般方法,如NSString可用(见post)?

实施例1

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:@"" forKey:@"emptyValue"];
NSNumber *emptyNumber = [dict objectForKey:@"emptyValue"];

emptyNumber包含哪个值?如何检查emptyNumber是否为空?

实施例2

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:@"" forKey:@"emptyValue"];
NSString *myString = [dict objectForKey:@"emptyValue"];
if (myString == nil || [myString length] == 0)
    // got an empty value
    NSNumber *emptyNumber=nil;

如果在emptyNumber设置为nil后使用这个,会发生什么?

[emptyNumber intValue]

我得零了吗

实施例3

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:@"" forKey:@"emptyValue"];
NSNumber *myEmptyValue = [dict objectForKey:@"emptyValue"];
if (myEmptyValue == nil)
    // NSLog is never called
    NSLog(@"It is empty!");

像这样,NSLog从不被调用。 myEmptyValue不是nil而不是NSNull。那么它包含一个任意数字?

NSValue,NSNumber,…应该从一个值创建并且始终保持一个。测试像0这样的特定值仅在不在您正在使用的有效值范围内时有效。

在极少数情况下,如果您的值代表“无效”或“未设置”,并且不能使用零(例如使用标准容器),则代码可以更直接的使用,您可以使用NSNull

在你的第一个例子中,这可能是:

[dict setValue:[NSNull null] forKey:@"emptyValue"];

if ([dict objectForKey:@"emptyValue"] == [NSNull null]) {
    // ...
}

但请注意,除非需要区分nil(即不在容器中),还可以说“无效”,否则您不能插入(或删除)该值。

if ([dict objectForKey:@"nonExistent"] == nil) {
    // ...
}

至于第二个例子,-intValue给你0,但只是因为发送消息到nil返回0.你也可以得到0例如。对于其intValue设置为0的NSNumber,可以是有效值。
正如我已经在上面写过的,如果0不是一个有效的值,你只能做这样的事情。请注意,对于您而言,最有效的工作完全取决于您的要求。

让我来总结一下:

选项1:

如果您不需要数字范围内的所有值,您可以使用一个(0或-1或…)和-intValue / …来具体表示“空”。这显然不是你的情况。

选项#2:

如果容器中的值为“空”,则不要存储或删除该值:

// add if not empty:
[dict setObject:someNumber forKey:someKey];    
// remove if empty:
[dict removeObjectForKey:someKey];
// retrieve number:
NSNumber *num = [dict objectForKey:someKey];
if (num == nil) {
    // ... wasn't in dictionary, which represents empty
} else {
    // ... not empty
}

这意味着键是空的键和从不存在或非法的键之间没有区别。

选项#3:

在一些罕见的情况下,它更方便地将所有键保存在字典中,并以不同的值表示“空”。如果你不能使用一个数字范围,我们必须把不同的东西放在一起,因为NSNumber没有一个“空”的概念。 Cocoa已经有NSNull这样的情况:

// set to number if not empty:
[dict setObject:someNumber forKey:someKey];
// set to NSNull if empty:
[dict setObject:[NSNull null] forKey:someKey];
// retrieve number:
id obj = [dict objectForKey:someKey];
if (obj == [NSNumber null]) {
    // ... empty
} else { 
    // ... not empty
    NSNumber *num = obj;
    // ...
}

此选项现在允许您区分“空”,“不为空”和“不在容器中”(例如非法键)。

http://stackoverflow.com/questions/3716599/check-if-nsnumber-is-empty

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:iphone – 检查NSNumber是否为空