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

Wil*_*sch 9 cocoa boolean objective-c

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

myBOOL = !myBOOL;
Run Code Online (Sandbox Code Playgroud)

但是如果BOOL有一个很长的名字怎么办?

objectWithLongishName.memberWithLongishName.submember.myBOOL = !(objectWithLongishName.memberWithLongishName.submember.myBOOL);  
Run Code Online (Sandbox Code Playgroud)

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

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

Sev*_*yev 10

#define NOT(b) (b) = !(b)

NOT(MyBooleanVariableWithAFreakishlyLongName);
Run Code Online (Sandbox Code Playgroud)

或者,如果它是Objective C++:

inline void NOT(BOOL &b)
{
    b = !b;
}
Run Code Online (Sandbox Code Playgroud)


Sev*_*yev 10

这是另一个:

MyBooleanYaddaYadda ^= YES;
Run Code Online (Sandbox Code Playgroud)

这有点脆 - 它将破坏遗留的C代码,暗示任何非零整数的计算结果为true.但是,Apple框架代码也是如此 - 我在Cocoa中遇到了一些非零,非一个int,当作为BOOL传递时,不会产生与传递YES相同的效果.

但是,它不依赖于YES的位模式 - 仅在NO为0时.考虑到C将整数解释为逻辑值的方式,这几乎是给定的.此外,它不假设BOOL的实际数据类型(signed char顺便说一句,在Cocoa上).

Cocoa上YES的位模式是1.但这不是一个普遍的约定.在某些没有内置布尔数据类型的平台上,用作逻辑TRUE的整数常量是-1- 所有一位.如果解释为无符号,则为0xFFFFFFFF.这种编码有一个模糊的优势在于bitwize NOT(了〜在C运算符)等效于逻辑NOT(C中的!运算符).也就是说,~0xFFFFFFFF为0,即~TRUE为FALSE.如果TRUE定义为1,则不起作用.


Bar*_*ark 9

不,(Objective-)C中没有明显的方法可以执行您描述的操作(不使用预处理器宏),但请参阅Seva对可能(尽管可能很脆弱)解决方案的回答.更重要的是,类似的东西objectWithLongishName.memberWithLongishName.submember.myBOOL表明了德米特违规 ; 您应该submember直接向需要访问的任何代码单元提供submember.myBOOL.


Dav*_*ong 6

submember类切换为您编写的方法?

- (void) toggleMyBOOL {
  self.myBool = !self.myBool;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

[objectWithLongishName.memberWithLongishName.submember toggleMyBOOL];
Run Code Online (Sandbox Code Playgroud)