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,则不起作用.
为submember
类切换为您编写的方法?
- (void) toggleMyBOOL {
self.myBool = !self.myBool;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
[objectWithLongishName.memberWithLongishName.submember toggleMyBOOL];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3715 次 |
最近记录: |