【问题标题】:Objective-C - Is !!BOOL BeneficialObjective-C - 是 !!BOOL 有益的
【发布时间】:2011-10-04 01:58:05
【问题描述】:

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

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

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

【问题讨论】:

  • 我见过的唯一一次是一个没有直接转换为 bool 方法的类,所以他们不能做 if(myInstance),但它确实使一元 @987654324 过载@运营商,所以他们会做if(!!myInstance)。但在你的情况下,我不知道。
  • 看起来是 ProtoBuf 生成的源代码。

标签: objective-c boolean design-patterns


【解决方案1】:

双布尔运算符只是确保返回的值是 1 或 0。仅此而已:)

【讨论】:

  • …防止像obj.hasId = 42; if (obj.hasId == YES)这样的代码不符合条件。从技术上讲,YES(当前)映射到 1,因此整数值不同。不过,从概念上讲,42 和YES 都代表一个真正的布尔值。双重否定将 42-assignment 折叠为 YES-assignment。
  • 谢谢,我想可能是这样的。但是这样做有用吗/是否避免了任何潜在的错误?就像这样可以防止在以if (obj.hasId == YES) 形式进行比较时出现意外错误?虽然这样的比较不是很差的风格吗?编辑:没关系,巴伐利亚打败了我。
  • 是的,但有时它实际上很有帮助,将其转换为 1 或 0,例如 SQLite 仅将布尔字段保存在 1 或 0 中。
  • @Bavarious 说了什么,但是——如果是那种防御性的——我至少会让这该死的东西可读; return _boolVar ? YES : NO;
【解决方案2】:

! 是逻辑否定运算符。因此,如果 setHasId: 被传递,例如 0x2,那么双重否定将存储 0x1。

【讨论】:

    【解决方案3】:

    相当于:

    hasId_ = value ? 1 : 0;
    

    在某些情况下它很有用,因为如果你这样做:

    BOOL x = y & MY_FLAG;
    

    如果设置了MY_FLAG,您可能会得到0,因为结果会被截断为BOOL(8 位)的大小。这是出乎意料的。出于同样的原因,人们有时更喜欢 BOOL 为 0 或 1(因此位操作按预期工作)。通常是不必要的。

    在具有内置 bool 类型的语言中,例如 C(从 C99 开始)和 C++,将整数转换为 bool 会自动执行此操作。

    【讨论】:

      【解决方案4】:

      在某些其他情况下更有意义,例如您返回 BOOL 但不想在其中放入 if 语句。

      - (BOOL)isMyVarSet
      {
          return !!myVar;
      }
      

      在这种情况下,我不能只返回 myVar,因为它不是 BOOL(这是一个非常人为的例子 - 我无法从我的项目中找出一个像样的例子)。

      【讨论】:

        【解决方案5】:

        我以前用过这个,我相信:

        if (!!myVar)

        相当于:

        if (myVar != nil)

        基本上,我用它来验证 SOMETHING 的值。

        我承认...这可能不是实现这一目标的最佳实践或最容易理解的方式。

        【讨论】:

        • 不同之处在于:(myVar != nil) 很明显,而 (!!myVar) 会阻止你,你必须认真思考它的作用,然后你必须思考甚至很难弄清楚写它的人是否真的是这个意思。最好把你的意思表达清楚。
        • 完全同意!我的答案是 3 岁,我今天绝对不会在任何新代码中写 !!var!
        猜你喜欢
        • 2010-11-16
        • 1970-01-01
        • 2020-03-13
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        • 2011-01-16
        • 2012-12-28
        • 2011-01-07
        相关资源
        最近更新 更多