如果BOOL有一个很好的短名称,那么写起来很容易:
myBOOL = !myBOOL;
但是如果BOOL有一个很长的名字呢?
objectWithLongishName.memberWithLongishName.submember.myBOOL = !(objectWithLongishName.memberWithLongishName.submember.myBOOL);
。 。 。看起来不那么漂亮。
我想知道是否有一种简单的方法来切换BOOL而不输入其名称两次?
答案 0 :(得分:10)
#define NOT(b) (b) = !(b)
NOT(MyBooleanVariableWithAFreakishlyLongName);
或者,如果它是Objective C ++:
inline void NOT(BOOL &b)
{
b = !b;
}
答案 1 :(得分:10)
这是另一个:
MyBooleanYaddaYadda ^= YES;
这有点脆弱 - 它会破坏传统的C代码,暗示任何非零整数的计算结果为true。但是,Apple框架代码也是如此 - 我在Cocoa中遇到了一些情况,其中一个非零的非一个int,当作为BOOL传递时,不会产生与传递YES相同的效果。
然而,它不依赖于YES的位模式 - 仅在NO为0时。考虑到C将整数解释为逻辑值的方式,这几乎是给定的。此外,它不假设BOOL的实际数据类型(顺便说一下,在Cocoa上是signed char
。)
Cocoa上YES的位模式是1.但这不是一个普遍的约定。在某些没有内置布尔数据类型的平台上,用作逻辑TRUE的整数常量是-1
- 所有一位。如果解释为无符号,则为0xFFFFFFFF。这种编码有一个模糊的优点,即bitwize NOT(C中的〜运算符)等价于逻辑NOT(C中的!运算符)。也就是说,~0xFFFFFFFF是0,i。即~TRUE是假的。如果TRUE定义为1,则无法正常工作。
答案 2 :(得分:9)
没有一个明显的方法在(Objective-)C中做你所描述的(不使用预处理器宏),但是看看Seva对可能的(尽管可能是脆弱的)解决方案的回答。更重要的是,objectWithLongishName.memberWithLongishName.submember.myBOOL
之类的内容表示Law of Demeter违规行为;您应该将submember
直接提供给需要访问submember.myBOOL
的任何代码单元。
答案 3 :(得分:6)
为submember
类编写一个方法,为您切换它?
- (void) toggleMyBOOL {
self.myBool = !self.myBool;
}
然后你可以这样做:
[objectWithLongishName.memberWithLongishName.submember toggleMyBOOL];
答案 4 :(得分:2)
使用异或。在C中,这是^。
BOOL x = YES;
x ^= YES; // it's now NO
x ^= YES; // it's now YES
x ^= YES; // it's now NO
x ^= YES; // it's now YES
x ^= YES; // it's now NO
x ^= YES; // it's now YES
...
编辑:有人发布了这个,显然。我想我应该说我从来没有在代码中实际使用它。 : - )
答案 5 :(得分:0)