代码之家  ›  专栏  ›  技术社区  ›  William Jockusch

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

  •  9
  • William Jockusch  · 技术社区  · 14 年前

    myBOOL = !myBOOL;
    

    但是如果那家伙的名字很长呢?

    objectWithLongishName.memberWithLongishName.submember.myBOOL = !(objectWithLongishName.memberWithLongishName.submember.myBOOL);  
    

    我想知道是否有一个简单的方法来切换布尔不输入它的名字两次?

    6 回复  |  直到 12 年前
        1
  •  10
  •   Seva Alekseyev    12 年前

    还有一个:

    MyBooleanYaddaYadda ^= YES;
    

    这有点脆弱-它会破坏遗留的C代码,这意味着任何非零整数的计算结果都是真的。不过,苹果的框架代码也是如此——我在Cocoa中遇到过这样的情况,当一个非零、非一的int作为BOOL传递时,不会产生与传递YES相同的效果。

    但是,它不依赖于YES的位模式—只依赖于NO为0。考虑到C将整数解释为逻辑值的方式,这基本上是给定的。而且,它不假定BOOL的实际数据类型(在Cocoa上是 signed char ,顺便说一下)。

    Cocoa上YES的位模式是1。但这不是一个普遍的惯例。在一些没有内置布尔数据类型的平台上,用作逻辑TRUE的整数常量是 -1 -所有一位。如果解释为无符号,则为0xffffff。这种编码有一个模糊的优点,即bitwize NOT(C中的~运算符)等价于logical NOT(逻辑NOT!C)中的运算符。也就是说,~0xffffff等于0,i。e~真是假。如果TRUE定义为1,则不起作用。

        2
  •  10
  •   Seva Alekseyev    10 年前
    #define NOT(b) (b) = !(b)
    
    NOT(MyBooleanVariableWithAFreakishlyLongName);
    

    inline void NOT(BOOL &b)
    {
        b = !b;
    }
    
        3
  •  9
  •   Barry Wark    14 年前

    objectWithLongishName.memberWithLongishName.submember.myBOOL Law of Demeter 违反;你应该提供 submember 直接访问任何需要访问的代码单元 submember.myBOOL

        4
  •  6
  •   Dave DeLong    14 年前

    submember 为您切换的类?

    - (void) toggleMyBOOL {
      self.myBool = !self.myBool;
    }
    

    然后你可以做:

    [objectWithLongishName.memberWithLongishName.submember toggleMyBOOL];
    
        5
  •  2
  •   Kalle    14 年前

    BOOL x = YES;
    x ^= YES; // it's now NO
    x ^= YES; // it's now YES
    x ^= YES; // it's now NO
    x ^= YES; // it's now YES
    x ^= YES; // it's now NO
    x ^= YES; // it's now YES
    ...
    

    编辑:显然已经有人发布了。我想我应该说我从来没有在代码中使用过这个

        6
  •  0
  •   bbum    14 年前

    你有一个可爱的答案集中在翻转一个是一个否或反之亦然,但 没有答案

    好吧,一些答案。我瞎了。

    也就是说,你有:

    objectWithLongishName.memberWithLongishName.submember.myBOOL =
        !(objectWithLongishName.memberWithLongishName.submember.myBOOL);  
    

    这闻起来像是潜在的封装违规。特别是(假设这是一个模型层),这意味着对象的子图的连通性被公开地暴露出来——有效地平坦化到——路径的入口点;无论什么 objectWithLongishName

    通常,您不会沿着关键路径深入到模型层来编辑Cocoa绑定层之外的状态(即使这样也有点脆弱)。

    有时候,这样漫长的道路是有道理的。在这种情况下,我会留下您上面的ber-verbose表单作为一个可视化的指示,表明封装正在被有目的地分解。