NS_OPTIONS匹配

niz*_*izx 19 objective-c ios

我正在尝试实现以下typedef

typedef NS_OPTIONS (NSInteger, MyCellCorners) {
    MyCellCornerTopLeft,
    MyCellCornerTopRight,
    MyCellCornerBottomLeft,
    MyCellCornerBottomRight,
};
Run Code Online (Sandbox Code Playgroud)

并正确分配值

MyCellCorners cellCorners = (MyCellCornerTopLeft | MyCellCornerTopRight);
Run Code Online (Sandbox Code Playgroud)

在绘制我的单元格时,如何检查哪些选项匹配,以便我可以正确绘制它.

小智 52

使用位掩码:

typedef NS_OPTIONS (NSInteger, MyCellCorners) {
    MyCellCornerTopLeft = 1 << 0,
    MyCellCornerTopRight = 1 << 1,
    MyCellCornerBottomLeft = 1 << 2,
    MyCellCornerBottomRight = 1 << 3,
};

MyCellCorners cellCorners = MyCellCornerTopLeft | MyCellCornerTopRight;

if (cellCorners & MyCellCornerTopLeft) {
    // top left corner set
}

if (etc...) {

}
Run Code Online (Sandbox Code Playgroud)

  • `else if`应该只是一个`if`.可以有多种选择. (3认同)

小智 21

检查此值的正确方法是首先按位AND值,然后检查是否与所需值相等.

MyCellCorners cellCorners = MyCellCornerTopLeft | MyCellCornerTopRight;

if ((cellCorners & MyCellCornerTopLeft) == MyCellCornerTopLeft) {
    // top left corner set
}
Run Code Online (Sandbox Code Playgroud)

以下参考资料解释了为什么这是正确的,并提供了枚举类型的其他见解.

参考:检查位值掩码中的值

  • @evfemist 仅当“comparisonValue”包含单个选项,或者您只想匹配“comparisonValue”中的*任何*选项(有时会出现这种情况)时,使用“if( myValue &amp; ComparisonValue ) { ... }”才合适。但在其他情况下,您可能会定义一个包含多个选项的选项,例如在 OP 情况下可能是“MyCellCornerTop”,它可能等于 3 (MyCellCornerTopRight | MyCellCornerTopLeft)。如果您随后执行了“if( myCellCorners &amp; MyCellCornerTop )”,则如果包含 TopLeft 或 TopRight,它将返回 true,但您可能希望检查两者,因此您需要“==” (2认同)