服务器响应== 0解释为布尔值YES

时间:2014-05-16 20:26:33

标签: objective-c json boolean

我在一个值为0的JSON对象中获得服务器响应。我想将其解释为FALSENO,但我得到了相反的结果。我究竟做错了什么?感谢。

NSString *text=[[NSString alloc]initWithData:d.receivedData encoding:NSUTF8StringEncoding];
NSLog(@"%@", text);
self.response = [NSJSONSerialization JSONObjectWithData:d.receivedData options:kNilOptions error:nil];
NSLog(@"%@", [[self.response valueForKey:@"message"] valueForKey:@"app_version_status"]);
int temp = (int)[[self.response valueForKey:@"message"] valueForKey:@"app_version_status"];
NSLog(@"%d", temp);
NSLog(temp ? @"yes" : @"no");

这是我的控制台输出:

2014-05-16 14:18:35.819 MyApp[4410:60b] {"result":"success","message":{"app_version_status":0}}
2014-05-16 14:18:35.847 MyApp[4410:60b] 0
2014-05-16 14:18:35.847 MyApp[4410:60b] 3  //<-- What???
2014-05-16 14:18:35.847 MyApp[4410:60b] yes

2 个答案:

答案 0 :(得分:4)

如果您将演员表移除到int,那么您将收到一个错误消息,告诉您确切的错误 - 您正在获取对象,而不是int。在这种情况下,它可能是一个NSNumber。如果你想要一个int,请询问它intValue

一般来说,对铸造非常保守是件好事。如果您遇到类型错误,请不要使用强制转换使其消失,除非您100%确定它是虚假的。如果出现了真正的错误,它可能仍然存在于演员阵容中,但现在您已经告诉编译器您不想听到它。

答案 1 :(得分:0)

self.response实际上是NSNumber个对象。它不是0的标量值,它是一个具有内部属性的对象,其值为0

通过类型化对一个对象(一个指针)的引用到int,你实际上得到了指针的值(我有点惊讶它只是&#39;只有&#39; 3)而不是对象的任何属性的值。

(从C角度来看,obj-c是C的扩展,对象在内存中表示为任何C结构。)

然后你继续使用指针并尝试将其评估为boolean。与03不同的任何值都与0不同,将评估为TRUE。只有0评估为FALSE。

尝试使用

NSNumber myIntNumber = self.response;
NSLog (@"%@", myIntNumber), 
NSLog (@"%d", [myIntNumber intValue]);
NSLog (@"%d", [myIntNumber booleanValue]);
NSLog (@"%d", [myIntNumber booleanValue] ? @"yes" : @"no");

......你会明白的。

相关问题