检查是否为空 NSNumber

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

OK 零很简单:


NSNumber *myNumber;
if /myNumber == nil/
doSomething


但是如果创建了对象,但没有价值,因为约会失败了,我该怎么办? 使用这样的东西?


if /[myNumber intValue]==0/
doSomething


例如,是否有一般的测试物体对象,例如 for NSString /看到这一点
http://www.wilshipley.com/blog ... .html
/?

例子 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

安装在零?


[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

, 它仅适用于您不在您使用的允许值范围内。

在罕见的情况下,当您具有表示值时代码更简单

"invalid"

或者

"not set"

, 你不能使用
nil

/例如,使用标准容器/, 您可以使用
http://developer.apple.com/lib ... 3-SW1
而不是这个。

在你的

第一个例子

有可能:


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

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


但请注意,您无法简单地插入 /或删除/ 如果您不需要区分,则此值
nil

/即不在容器中/ 和,让我们说

"invalid"

:


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


关于

第二个例子

, 那
-intValue

给你
0

- 只是因为发送消息
nil

回报
0

. 你也可以得到
0

, 例如,
NSNumber

, 谁的
intValue

早些时候安装在
0

, 什么可以是有效的价值。

正如我已经写过的那样,只有在
0


不适合您允许的价值

. 注意

为你

最重要的是取决于您的要求。

让我试试

测试

结果 :

选项 #1:

如果您不需要来自数字数量的所有值,则可以使用一个 /
0

或者
-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"

与另一个值。 如果您不能使用其中一个数字之一,我们必须放弃其他东西
NSNumber

没有概念

"empty"

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


现在,此选项允许您区分

"empty"

,

"not empty"



"not in the container"

/例如,非法关键/.

龙天

赞同来自:

NSNumber

- 这是要么
nil

, 无论是它包含一个数字,其中什么都不是。 “空虚”是一个概念,取决于特定对象的语义,因此看起来没有意义寻找空虚的一般扫描。

至于您的例子,这里有几件事:


NSMutableDictionary *hash = [NSMutableDictionary dictionary];
[hash setObject:@"" forKey:@"key"];
NSNumber *number = [hash objectForKey:@"key"];
NSLog/@"%i", [number intValue]/;



NSLog

将退出这里
0

, 但只是因为
NSString

有一种方法
intValue

. 如果您将消息更改为只能完成的内容
NSNumber

, 代码将失败:


NSLog/@"%i", [number unsignedIntValue]/;


它会抛出:


-[NSCFString unsignedIntValue]: unrecognized selector sent to instance 0x303c


这意味着你

不是

得到某种一般意义 “empty” 退出 hash, 你刚刚得到
NSString

, 你在那里保存了哪些。

当你有空的时候 /
== nil

/
NSNumber

并且您向他发送消息,结果将是零。 这只是一种语言协议,简化了代码:


/array != nil && [array count] == 0/
/someNumber == nil ? 0 : [someNumber intValue]/


会变成它:


/[array count] == 0/
/[someNumber intValue]/


我希望它会有所帮助。

三叔

赞同来自:

与之合作 Swift 2.0 和分析:


var myNumber = yourArray!.objectForKey/"yourColumnTitle"/
if /myNumber == nil/ {
myNumber = 0
}


在我的情况下,我就是:


let myNumberIntValue = myNumber!.intValue

帅驴

赞同来自:

NSNumber

s 它们是不可变的,只能在工厂方法或初始方法的帮助下创建,这给了它们一些数值。 据我所知,这是不可能的 'empty' NSNumber, 如果你不这么认为 0.

君笑尘

赞同来自:

经常 /至少对于我来说/ 它从字典中掉出对象,等待它将 NSNumber, 然后它返回一个零对象。 如果发生这种情况,你会这样做 intValue, 他会崩溃。

我所做的是我安装零保护,因为我更愿意得到默认值而不是失败。

其中一种方式是:


-/int/ intForDictionary:/NSDictionary */thisDict objectForKey: /NSString */thisKey withDefault: /int/defaultValue
{
NSNumber *thisNumber = [thisDict objectForKey:thisKey];
if /thisNumber == nil/ {
return defaultValue;
}
return [thisNumber intValue];
}


我对浮子有完全相同的。 至少你,至少会得到默认值。 其他方式 - 只需创建零保护方法..


-/NSNumber */nilProtectionForNumber: /NSNumber */thisNumber withDefault: /NSNumber */defaultNumber
{
if /thisNumber/ {
return thisNumber;
}
else
return defaultNumber;
}


你将被称为这样的人:


NSNumber *value = [self nilProtectionForNumber:[dict objectForKey:keyThatShouldBeNSNumber] withDefault:[NSNumber numberWithInt:0]];

要回复问题请先登录注册