NSValue
, NSNumber
, ... 应该是根据一个值创建的,并且始终保留一个值。测试特定值,例如0
仅当它不在您正在使用的有效值范围内时才有效。
在极少数情况下,如果您有一个代表的值,则代码可以更直接地使用“无效的” or “没有设置”你不能使用nil
(例如使用标准容器)您可以使用NSNull http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html#//apple_ref/doc/uid/TP40005153-SW1反而。
In your 第一个例子这可能是:
[dict setValue:[NSNull null] forKey:@"emptyValue"];
if ([dict objectForKey:@"emptyValue"] == [NSNull null]) {
// ...
}
但请注意,除非需要区分,否则您不能插入(或删除)该值nil
(即不在容器中)并且,比如说,“无效的”:
if ([dict objectForKey:@"nonExistent"] == nil) {
// ...
}
至于第二个例子, -intValue
给你0
- 但仅仅是因为发送消息到nil
回报0
。您还可以获得0
例如为一个NSNumber
whose intValue
被设置为0
之前,这可能是一个有效值。
正如我上面已经写过的,你只能做这样的事情,如果0
对您来说不是有效值。请注意for you,什么最有效完全取决于您的要求。
让我尝试一下总结:
选项1:
如果您不需要数字范围内的所有值,您可以使用一个 (0
or -1
或...)和-intValue
/ ...具体表示"empty"。显然您的情况并非如此。
选项#2:
如果值是这样的话,您就不会从容器中存储或删除这些值"empty":
// 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:
在某些罕见的情况下,将所有键保留在字典中并表示会更方便"empty"具有不同的值。如果您不能使用数字范围中的一个,我们必须在 as 中添加不同的内容NSNumber
没有一个概念"empty"。可可已经有了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;
// ...
}
此选项现在允许您区分"empty", “不是空的” and “不在容器中”(例如非法密钥)。