检查NSNumber是否为空 [英] check if NSNumber is empty

查看:2018
本文介绍了检查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)
//得到一个空值
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永远不会调用
NSLog(@It is empty!

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

解决方案

NSValue NSNumber ,...应该从一个值创建并始终保持一个。测试 0 等特定值只有在不在您使用的有效值范围内时才有效。



在极少数情况下,如果代码具有代表无效未设置的值,代码更为直接, t使用 nil (例如使用标准容器),您可以使用 NSNull 。 p>

在您的第一个示例中,可以是:

  [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];
//检索数字:
NSNumber * num = [dict objectForKey:someKey];
if(num == nil){
// ...不在字典中,代表空
} else {
// ...不为空
}

然而,这意味着空的键和永远不存在的键之间没有区别



在某些罕见的情况下更方便地将所有键保存在字典中,并用不同的值表示。如果你不能使用一个从数字范围,我们必须把不同的东西在 NSNumber 没有一个概念 。对于这种情况,Cocoa已经有 NSNull

  //设置为number如果不为空:
[dict setObject:someNumber forKey:someKey];
//如果为空,设置为NSNull:
[dict setObject:[NSNull null] forKey:someKey];
//检索数字:
id obj = [dict objectForKey:someKey];
if(obj == [NSNumber null]){
// ...空
} else {
// ...不为空
NSNumber * num = obj;
// ...
}

此选项现在允许您区分之间 (例如非法键)

$ b $ b

How do I check if a NSNumber object is nil or empty?

OK nil is easy:

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

But if the object has been created, but there is no value in it because an assignment failed, how can I check this? Use something like this?

if ([myNumber intValue]==0)
   doSomething

Is there a general method for testing objects on emptiness like for NSString available (see this post)?

Example 1

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

Which value does emptyNumber contain? How can I check if emptyNumber is empty?

Example 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;

What happens if I use this after emptyNumber was set to nil?

[emptyNumber intValue]

Do I get zero?

Example 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!");

Like this way NSLog is never called. myEmptyValue is not nil and not NSNull. So it contains an arbitrary number?

解决方案

NSValue, NSNumber, ... are supposed to be created from a value and to always hold one. Testing for a specific value like 0 only works if it isn't in the range of valid values you are working with.

In the rare case where code is more straight-forward to work with if you have a value that represents "invalid" or "not set" and you can't use nil (e.g. with the standard containers) you can use NSNull instead.

In your first example this could be:

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

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

But note that you can simply not insert (or remove) that value unless you need to differentiate nil (i.e. not in the container) and, say, "invalid":

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

As for the second example, -intValue gives you 0 - but simply because sending messages to nil returns 0. You could also get 0 e.g. for a NSNumber whose intValue was set to 0 before, which could be a valid value.
As i already wrote above, you can only do something like this if 0 is not a valid value for you. Note the for you, what works best completely depends on what your requirements are.

Let me try to summarize:

Option #1:

If you don't need all values from the numbers range, you could use one (0 or -1 or ...) and -intValue / ... to specifically represent "empty". This is apparently not the case for you.

Option #2:

You simply don't store or remove the values from the container if they are "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
}

This however means that there is no difference between keys that are empty and keys that never exist or are illegal.

Option #3:

In some rare cases its more convenient to keep all keys in the dictionary and represent "empty" with a different value. If you can't use one from the number range we have to put something differently in as NSNumber doesn't have a concept of "empty". Cocoa already has NSNull for such cases:

// 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;
    // ...
}

This option now allows you to differentiate between "empty", "not empty" and "not in the container" (e.g. illegal key).

这篇关于检查NSNumber是否为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆