我正在查看另一位开发人员提交给项目的差异,他们有很多代码!!<some BOOL value>
。实际上,这似乎是实现布尔getter和setter的标准模式。他们已经实现了如下代码:
- (BOOL) hasId {
return !!hasId_;
}
- (void) setHasId:(BOOL) value {
hasId_ = !!value;
}
我之前从未见过这种模式,我想知道使用它是否有任何好处。双重否定是否有用?
答案 0 :(得分:13)
double boolean运算符只是确保返回的值是1或0.这就是:)
答案 1 :(得分:3)
!
是一个逻辑否定运算符。因此,如果setHasId:被传递,例如,0x2则双重否定将存储0x1。
答案 2 :(得分:1)
相当于:
hasId_ = value ? 1 : 0;
在某些情况下这很有用,因为如果你这样做:
BOOL x = y & MY_FLAG;
如果设置了MY_FLAG
,则可能会得到0,因为结果会被截断为BOOL
(8位)的大小。这是出乎意料的。出于同样的原因,人们有时更喜欢BOOL
为0或1(因此位操作按预期工作)。通常没必要。
在具有内置bool
类型的语言(例如C(从C99开始)和C ++)中,将整数转换为bool
会自动执行此操作。
答案 3 :(得分:0)
在某些其他情况下更有意义,例如您返回BOOL
但不想在其中添加if
语句。
- (BOOL)isMyVarSet
{
return !!myVar;
}
在这种情况下,我不能只返回myVar
,因为它不是BOOL
(这是一个非常人为的例子 - 我无法从我的项目中挖掘出一个不错的例子)。
答案 4 :(得分:0)
我以前用过这个,我相信:
if (!!myVar)
相当于:
if (myVar != nil)
基本上,我用它来验证SOMETHING的价值。
我承认......这可能不是实现这一目标的最佳实践或最常见的方式。