Objective c 服务器响应==0解释为布尔值“是”

Objective c 服务器响应==0解释为布尔值“是”,objective-c,json,boolean,Objective C,Json,Boolean,我在一个JSON对象中得到一个服务器响应,该对象的值为0。我想将其解释为FALSE或NO,但我得到了相反的结果。我做错了什么?谢谢 NSString *text=[[NSString alloc]initWithData:d.receivedData encoding:NSUTF8StringEncoding]; NSLog(@"%@", text); self.response = [NSJSONSerialization JSONObjectWithData:d.receivedData o

我在一个JSON对象中得到一个服务器响应,该对象的值为
0
。我想将其解释为
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
2014-05-16 14:18:35.819我的应用程序[4410:60b]{“结果”:“成功”,“消息”:{“应用程序版本\状态”:0}
2014-05-16 14:18:35.847 MyApp[4410:60b]0

2014-05-16 14:18:35.847 MyApp[4410:60b]3//如果将强制转换移除为int,则会出现一个错误,告诉您到底出了什么问题-您得到的是一个对象,而不是int。在这种情况下,它可能是一个NSNumber。如果您想要一个int,请询问它的
intValue


一般来说,在铸造方面非常保守是好的。如果你得到一个类型错误,不要使用强制转换使它消失,除非你100%确定它是假的。如果真的有错误,它可能仍然存在于强制转换中,但是现在您已经告诉编译器您不想听到它。

如果您将强制转换删除为int,您将得到一个错误,告诉您到底是什么错了-您得到的是一个对象,而不是int。在这种情况下,它可能是一个NSNumber。如果您想要一个int,请询问它的
intValue


一般来说,在铸造方面非常保守是好的。如果你得到一个类型错误,不要使用强制转换使它消失,除非你100%确定它是假的。如果真的有错误,它可能仍然存在于cast中,但是现在您已经告诉编译器您不想听到它。

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

通过将一个对象(也就是指针)的引用类型转换为int,实际上得到的是指针的值(我有点惊讶,它是'only'3),而不是对象任何属性的值

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

然后继续使用指针,并尝试将其计算为
布尔值。任何与
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");

。。。你会明白的

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

通过将一个对象(也就是指针)的引用类型转换为int,实际上得到的是指针的值(我有点惊讶,它是'only'3),而不是对象任何属性的值

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

然后继续使用指针,并尝试将其计算为
布尔值。任何与
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");

。。。你会明白的

任何非0的数字在C(和Objective-C)中的条件中都是“true”,因此可以丢弃零件。然后只关注强制转换-强制转换之前的值是多少?但是服务器响应是“0”。如果服务器响应的字符“0”不是零,那么它就是零。任何非0的数字在C(和Objective-C)中的条件中都是“true”,因此可以丢弃该部分。然后只关注强制转换-强制转换之前的值是多少?但是服务器响应是“0”。这就是零,对吗?如果服务器响应是字符“0”,那就不是零。明白了。谢谢(只要允许,我会尽快接受)。“[I]这可能是一个NSNumber。”考虑到它是从JSON反序列化的,它不是一个
NSString
?无论如何,关于避免误用类型转换的极好建议+仅此一项就有1项。:-)知道了。谢谢(只要允许,我会尽快接受)。“[I]这可能是一个NSNumber。”考虑到它是从JSON反序列化的,它不是一个
NSString
?无论如何,关于避免误用类型转换的极好建议+仅此一项就有1项。:-)它是3,因为Objective-C现在使用标记指针。低阶位中的IIRC a 1表示它被标记,下一位中的1表示它是一个数字,其余的位是0,因为数字是0,所以得到位模式
0000…0011
,看起来像整数3。(标签的工作原理可能与我记忆中的略有不同,但总体思路是这样的。)@Chuck,很有趣。谢谢。考虑到@Chuck的评论,这意味着self.response为null,而不是一个值为0的NSNumber。但我不明白为什么,它不是空的。好吧,这是表示数字0的标记指针值,与您从
[NSNumber numberwhithint:0]
中获得的相同。空还是全零,我想我明白了。谢谢。现在是3,因为Objective-C现在使用带标记的指针。低阶位中的IIRC a 1表示它被标记,下一位中的1表示它是一个数字,其余的位是0,因为数字是0,所以得到位模式
0000…0011
,看起来像整数3。(标签的工作原理可能与我记忆中的略有不同,但总体思路是这样的。)@Chuck,很有趣。谢谢。考虑到@Chuck的评论,这意味着self.response为null,而不是一个值为0的NSNumber。但我不明白为什么,它不是空的。好吧,这是表示数字0的标记指针值,与您从
[NSNumber numberwhithint:0]
中获得的相同。空还是全零,我想我明白了。谢谢