Objective c 服务器响应==0解释为布尔值“是”
我在一个JSON对象中得到一个服务器响应,该对象的值为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
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]
中获得的相同。空还是全零,我想我明白了。谢谢