我希望每次检测到点击时都会反转BOOL
的值。 BOOL
的默认值为NO
,我第一次点按它会将其反转为YES
。在随后的点击中,值保持为YES
。
@property(nonatomic, assign) BOOL isDayOrNight; //property in timeDayChart object.
self.timeDayChart.isDayOrNight = ~self.timeDayChart.isDayOrNight; //This is done in a VC.
我不得不改变它:
self.timeDayChart.isDayOrNight = !self.timeDayChart.isDayOrNight;
实现我想要的结果。我想知道为什么~
没有按预期工作。
答案 0 :(得分:2)
BOOL被定义为objc.h中的签名字符:
typedef signed char BOOL;
和YES和NO的定义如下:
#define YES (BOOL)1
#define NO (BOOL)0
所以~YES是-2,这与NO不同。
答案 1 :(得分:2)
在(Objective-)C(++)中,当需要布尔值时,例如在if
中或作为&&
的操作数,实际取一个整数值并将0解释为false和非零为真。逻辑,关系和相等运算符都返回整数,使用0表示false,使用1表示true。
Objective-C' BOOL
是signed char
的同义词,它是整数类型,而NO
和YES
分别定义为0和1。
正确状态~
是位反转运算符。如果你反转任何包含0&1和1的整数,结果也会这样做。任何包含1位的值都被视为true,并且反转除了所有1之外的任何此类值都会生成一个至少有一个1位的值,该值也被解释为true。
如果你从0开始,那么重复的反转应该全部为1,全部为0,全部为1 - 这是真,假,真等。(但是不是,否,是等等)。因此,如果你从0开始,那么要么你并不总是使用反演,要么你明确地测试YES
而不是真。
然而,你应该使用的是!
- 逻辑否定 - 它将0映射到1而非0映射到0,因此处理" true"正确的值不是1。
HTH
答案 2 :(得分:0)
找一本关于C语言的书。检查它对〜运算符的说法和!运营商。 〜反转整数中的所有位,BOOL定义为整数类型。因此NO =所有位0将被更改为所有设置的位,这与YES不同,并且YES =除了最后一位= 1之外的所有位将被更改为除最后一位= 0之外的所有位设置。
答案 3 :(得分:0)
最好使用这个习惯用来切换BOOL值:
self.timeDayChart.isDay = self.timeDayChart.isDay ? NO : YES;
(我故意改变了你的财产的命名)