Cocoa - 切换BOOL而不重复其名称

时间:2010-07-22 20:44:24

标签: objective-c cocoa boolean

如果BOOL有一个很好的短名称,那么写起来很容易:

myBOOL = !myBOOL;

但是如果BOOL有一个很长的名字呢?

objectWithLongishName.memberWithLongishName.submember.myBOOL = !(objectWithLongishName.memberWithLongishName.submember.myBOOL);  

。 。 。看起来不那么漂亮。

我想知道是否有一种简单的方法来切换BOOL而不输入其名称两次?

6 个答案:

答案 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)