【问题标题】:Switch-case alternative to test a subset of bits in an Option Set?测试选项集中位子集的切换案例替代方案?
【发布时间】:2019-03-01 09:25:19
【问题描述】:

我有一个选项集,用于有效地存储有关对象的各种信息。 IE。前 6 位左右决定了“类型”,几个位决定了它是否处于某些状态,这可能是互斥的,也可能不是互斥的。

我将这一切作为一个大选项集。我知道我的一种实现选择是返回并将其重新设计为单独的枚举。唉,那会困难得多,而且我真的很喜欢需要存储的一个 int 来保存所有这些信息。

目前,我无法使用 switch case,因为该值很少与单个选项匹配。我希望能够在类型部分上做一个开关盒,在状态部分上做一个单独的开关盒。但是,我能找到的唯一实现是一些丑陋的 if / else 链。

还有其他一些我可能遗漏的操作可以更好地完成此任务吗?

【问题讨论】:

    标签: objective-c switch-statement option-set


    【解决方案1】:

    所以,我在输入问题时脑洞大开,但是由于我首先进行了一些搜索并且没有发现任何有用的信息,所以我想我还是会发帖。

    这仅在您尝试测试互斥选项子集时才有效。 IE。我提到了我的前几位确定类型或类别。在选项集的定义中,您可以灵活地定义一些其他值。在这里,我添加了一个 'allTypes' 选项,其中包含确定类型的所有位。

    typedef NS_OPTIONS(NSInteger, kPropertyState) {
        kTypeNone                            = 0,
        kType1                               = 1,
        kType2                               = 1 << 1,
        kType3                               = 1 << 2,
        kState1                              = 1 << 3,
        kState2                              = 1 << 4,
    // ... ... ...
        kAllTypes                            = kType1 | kType2 | kType3
    };
    

    然后,当我想对类型执行 switch case 检查时,我可以这样做:

    kPropertyState propertyState = // ... 然而这是获得的

    switch( propertyState & .kAllTypes ) {
        case kType1: // ...
        case kType2: // ...
        case kType3: // ...
        default: // . . .
    }
    

    只需按位使用并隔离位。由于这些位相互排斥,因此您不必担心其他位会影响案例检查。此外,通过将按位和放在 switch 语句中,我的 propertyState 实际上并没有改变,我仍然可以访问相关案例块内的其他状态位。

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 2021-12-19
      • 2016-03-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      相关资源
      最近更新 更多