2012-12-11 32 views
18

我想畫我的手機時,實現下面的typedefNS_OPTIONS匹配

typedef NS_OPTIONS (NSInteger, MyCellCorners) { 
    MyCellCornerTopLeft, 
    MyCellCornerTopRight, 
    MyCellCornerBottomLeft, 
    MyCellCornerBottomRight, 
}; 

,並正確地

MyCellCorners cellCorners = (MyCellCornerTopLeft | MyCellCornerTopRight); 

分配一個值,我怎麼能檢查哪些選項符合這樣我就可以正確繪製它。

回答

17

正確的方法來檢查這個值是首先按位和值,然後檢查平等所需的值。

MyCellCorners cellCorners = MyCellCornerTopLeft | MyCellCornerTopRight; 

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

以下參考資料解釋了爲什麼這是正確的,並提供了對枚舉類型的其他見解。

參考:checking-for-a-value-in-a-bit-mask

+0

非常感謝您的糾正。 – nizx

+0

很古老的問題,但答案中有混淆。對於NS_Options將足以檢查 '如果(cellCorners&MyCellCornerTopLeft){' 中提供的參考也有錯,筆者約NS_Options會談,但例如他用TransitionCurlDown這是NS_Enum。 從NS_Enum中檢查答案是正確的,但對於NS_Enum我們可以使用簡單的'=='比較。 – evfemist

+0

@evfemist使用'if(myValue&comparisonValue){...}'只適用於'comparatorValue'包含單個選項,或者您只想匹配compareValue中的任何*選項,有時候這種情況就是這種情況。但在其他情況下,您可能會定義一個包含多個選項的選項,就像在OP中的情況一樣,可能是一個「MyCellCornerTop」,它可能等於3(MyCellCornerTopRight | MyCellCornerTopLeft)。如果你接着執行'if(myCellCorners&MyCellCornerTop)',如果包含了TopLeft或TopRight,它將返回true,但是你可能想要檢查兩者,所以你需要'==' –

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...) { 

} 
+1

+1 ..這是相當快。 :) – iDev

+0

@ACB財富:)謝謝。 – 2012-12-11 06:26:48

+3

'else if'只能是'if'。多個選項是可能的。 – Jochen

0

我NSWill同意。我最近有一個類似的問題與錯誤的比較。

正確的if語句應該是:

if ((cellCorners & MyCellCornerTopLeft) == MyCellCornerTopLeft){ 
+1

您正在重複@nswill的答案 – benka