Objective-C - 是!! BOOL有益

时间:2011-07-12 23:20:23

标签: objective-c boolean design-patterns

我正在查看另一位开发人员提交给项目的差异,他们有很多代码!!<some BOOL value>。实际上,这似乎是实现布尔getter和setter的标准模式。他们已经实现了如下代码:

- (BOOL) hasId {
    return !!hasId_;
}
- (void) setHasId:(BOOL) value {
    hasId_ = !!value;
}

我之前从未见过这种模式,我想知道使用它是否有任何好处。双重否定是否有用?

5 个答案:

答案 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的价值。

我承认......这可能不是实现这一目标的最佳实践或最常见的方式。