我在一个值为0
的JSON对象中获得服务器响应。我想将其解释为FALSE
或NO
,但我得到了相反的结果。我究竟做错了什么?感谢。
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
答案 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
。与0
和3
不同的任何值都与0
不同,将评估为TRUE
。只有0评估为FALSE。
尝试使用
NSNumber myIntNumber = self.response;
NSLog (@"%@", myIntNumber),
NSLog (@"%d", [myIntNumber intValue]);
NSLog (@"%d", [myIntNumber booleanValue]);
NSLog (@"%d", [myIntNumber booleanValue] ? @"yes" : @"no");
......你会明白的。