2012-12-11 12 views
18

Próbuję realizować następujące typedefNS_OPTIONS mecze

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

i prawidłowo przypisać wartość z

MyCellCorners cellCorners = (MyCellCornerTopLeft | MyCellCornerTopRight); 

podczas rysowania moją komórkę, w jaki sposób można sprawdzić, która z opcji pasuje więc mogę poprawnie go narysuj.

Odpowiedz

17

Prawidłowe sposobem na sprawdzenie tej wartości jest pierwszym bitowe i wartości, a następnie sprawdzić, równości do wymaganej wartości.

MyCellCorners cellCorners = MyCellCornerTopLeft | MyCellCornerTopRight; 

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

Poniższe odniesienie wyjaśnia, dlaczego jest to poprawne i zapewnia inne informacje na temat typów wyliczeniowych.

referencyjny: checking-for-a-value-in-a-bit-mask

+0

Bardzo dziękuję za korektę. – nizx

+0

dość stare pytanie, ale w odpowiedzi są zamieszanie. Dla NS_Options wystarczy sprawdzić 'if (cellCorners & MyCellCornerTopLeft) {' w podanym odnośniku są błędy, autor mówi o NS_Options, ale w przykładzie użył TransitionCurlDown, który jest NS_Enum. Sprawdź od odpowiedzi jest poprawna dla NS_Enum, ale dla NS_Enum możemy użyć prostego porównania "==". – evfemist

+0

@evfemist Użycie 'if (myValue & comparisonValue) {...}' jest odpowiednie tylko wtedy, gdy 'comparisonValue' zawiera pojedynczą opcję, lub jeśli chcesz tylko dopasować * dowolną * opcję w compareValue, co czasami ma miejsce. Ale w innych przypadkach możesz zdefiniować opcję, która zawiera wiele opcji, np. W przypadku OP, może to być 'MyCellCornerTop', który może być równy 3 (MyCellCornerTopRight | MyCellCornerTopLeft). Jeśli wtedy zrobiłeś 'if (myCellCorners & MyCellCornerTop)', to zwróci true jeśli dołączono EITHER TopLeft lub TopRight, ale możesz chcieć sprawdzić oba, więc potrzebujesz '==' –

52

Zastosowanie bit maskowania:

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 .. To było dość szybkie. :) – iDev

+0

@ Fortuna Fortuna :) Dzięki. –

+3

"else if" powinno być tylko 'if'. Możliwych jest wiele opcji. – Jochen

0

zgadzam się z NSWill. Ostatnio miałem podobny problem ze złym porównaniem.

Prawo if powinno być:

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

Powtarzasz odpowiedź @nswill – benka

Powiązane problemy