gpt4 book ai didi

ios - 为什么 [@(!var) class] 返回'__NSCFNumber'而不是'__NSCFBoolean'?

转载 作者:行者123 更新时间:2023-12-01 18:37:32 36 4
gpt4 key购买 nike

当我通过字典时@{@"MUTE":@(flag)}+[NSJSONSerialization dataWithJSONObject:options:error:] ,它返回一个像 { "MUTE" : true } 这样的 JSON ,这是我所期望的。

但是当我把我的字典改成 @{@"MUTE":@(!flag)} ,它会生成这样的 JSON { "MUTE" : 0 } ,这是我们的服务器不能接受的。

所以我写了一些测试代码来看看这里发生了什么:

BOOL var = YES;
NSLog(@"%@", [@(var) class]); // print __NSCFBoolean
NSLog(@"%@", [@(!var) class]); // print __NSCFNumber
NSLog(@"%@", [@((BOOL)!var) class]);// print __NSCFBoolean

似乎逻辑 NOT 表达式会产生非 BOOL 类型的值。

但是在用 C++ 重写上面的代码后,clang 告诉了我一个不同的故事:
BOOL var = ((bool)1);

NSLog((NSString *)&__NSConstantStringImpl__var_folders_vg_0k7tkth9043fl0g9sf5l9l3w0000gn_T_main_8479d3_mi_0, ((Class (*)(id, SEL))(void *)objc_msgSend)((id)((NSNumber *(*)(Class, SEL, BOOL))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithBool:"), (BOOL)(var)), sel_registerName("class")));
NSLog((NSString *)&__NSConstantStringImpl__var_folders_vg_0k7tkth9043fl0g9sf5l9l3w0000gn_T_main_8479d3_mi_1, ((Class (*)(id, SEL))(void *)objc_msgSend)((id)((NSNumber *(*)(Class, SEL, BOOL))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithBool:"), (BOOL)(!var)), sel_registerName("class")));
NSLog((NSString *)&__NSConstantStringImpl__var_folders_vg_0k7tkth9043fl0g9sf5l9l3w0000gn_T_main_8479d3_mi_2, ((Class (*)(id, SEL))(void *)objc_msgSend)((id)((NSNumber *(*)(Class, SEL, BOOL))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithBool:"), ((BOOL)!var)), sel_registerName("class")));

任何人都知道 @(!var) 中出了什么问题?

最佳答案

这是Objective-C的C部分。 C 逻辑运算符,例如 && , ||!都将其操作数与(不)等于 0 进行比较并返回 int值 0 或 1。这源于 C 最初没有任何内置的 bool 类型。

所以在你的表达中@(!var) !var有类型 int__NSCFNumber对象被创建。

高温高压

关于ios - 为什么 [@(!var) class] 返回'__NSCFNumber'而不是'__NSCFBoolean'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49962494/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com