2012-12-11 33 views
18

Tôi cố gắng để thực hiện những điều sau typedefNS_OPTIONS phù hợp

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

và chính xác gán một giá trị với

MyCellCorners cellCorners = (MyCellCornerTopLeft | MyCellCornerTopRight); 

khi vẽ di động của tôi, làm sao tôi có thể kiểm tra trong những lựa chọn phù hợp vì vậy tôi có thể vẽ chính xác nó.

Trả lời

17

Cách đúng để kiểm tra các giá trị này là để Bitwise đầu tiên và các giá trị và sau đó kiểm tra cho sự bình đẳng với giá trị yêu cầu.

MyCellCorners cellCorners = MyCellCornerTopLeft | MyCellCornerTopRight; 

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

Tham chiếu sau đây giải thích lý do chính xác và cung cấp thông tin chi tiết khác về các loại được liệt kê.

Tham chiếu: checking-for-a-value-in-a-bit-mask

+0

Cảm ơn rất nhiều về sự điều chỉnh. – nizx

+0

câu hỏi khá cũ, nhưng có nhầm lẫn trong câu trả lời. Đối với NS_Options sẽ đủ để kiểm tra 'if (cellCorners & MyCellCornerTopLeft) {' trong tham chiếu được cung cấp có lỗi, tác giả nói về NS_Options nhưng ví dụ anh ta sử dụng TransitionCurlDown là NS_Enum. kiểm tra từ câu trả lời là đúng cho NS_Enum, nhưng đối với NS_Enum chúng ta có thể sử dụng so sánh '== 'đơn giản. – evfemist

+0

@evfemist Sử dụng 'if (myValue & comparisonValue) {...}' chỉ phù hợp nếu 'compareValue' chứa một tùy chọn duy nhất, hoặc nếu bạn chỉ muốn so khớp tùy chọn * any * trong compareValue, đôi khi là trường hợp. Nhưng các trường hợp khác, bạn có thể xác định một tùy chọn có chứa nhiều tùy chọn, như trong trường hợp OPs có thể là 'MyCellCornerTop', có thể bằng 3 (MyCellCornerTopRight | MyCellCornerTopLeft). Nếu bạn sau đó đã làm 'if (myCellCorners & MyCellCornerTop)', nó sẽ trả về true nếu EITHER TopLeft hoặc TopRight được bao gồm, nhưng bạn có thể muốn kiểm tra cả hai, vì vậy bạn cần '==' –

52

Sử dụng mặt nạ chút:

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 .. Đó là khá nhanh chóng. :) – iDev

+0

@ACB Fortune :) Cảm ơn. –

+3

'else if' chỉ nên là' if'. Có nhiều tùy chọn. – Jochen

0

Tôi đồng ý với NSWill. Gần đây tôi đã có một vấn đề tương tự với so sánh sai.

Quyền lệnh if nên là:

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

Bạn đang lặp lại câu trả lời của @nswill – benka

Các vấn đề liên quan