20

これで達成したいことの簡単な紹介: たとえば、下側と左側に矢印を表示したい
という習慣があります。UIViewこれも同じようにできると思いましUIViewAutoresizingた。

そこでtypedef、カスタムビュー用に同様のものを作成しました。

typedef NS_OPTIONS(NSUInteger, Arrows) {
    ArrowNone      = 0,
    ArrowRight     = 1 << 0,
    ArrowBottom    = 1 << 1,
    ArrowLeft      = 1 << 2,
    ArrowTop       = 1 << 3
};

また、カスタムビューヘッダーファイルに、次のものを追加しました。

@property (nonatomic) Arrows arrows;

これはすべて機能し、プロパティを設定できるようになりました。
customview.arrows = (ArrowBottom | ArrowLeft);

これはを返します6

今私の質問です、私のarrowsプロパティに下と左が含まれているかどうかをどのように確認できますか?私は試した:

if (self.arrows == ArrowLeft) {
    NSLog(@"Show arrow left");
}

これは何もしませんでした。これを確認する別の方法はありますか?

4

3 に答える 3

36

ビットマスクを確認する正しい方法は、次のように AND (&) 演算子を使用して値をデコードすることです。

Arrows a = (ArrowLeft | ArrowRight);    
if (a & ArrowBottom) {
   NSLog(@"arrow bottom code here");    
}

if (a & ArrowLeft) {
   NSLog(@"arrow left code here");    
}    

if (a & ArrowRight) {
   NSLog(@"arrow right code here");    
}

if (a & ArrowTop) {
   NSLog(@"arrow top code here");    
}

これはコンソールに出力されます:

arrow left code here
arrow right code here
于 2012-12-11T11:43:46.257 に答える
5

この値を確認する正しい方法は、最初に値のビットごとの AND をとり、次に必要な値と等しいかどうかを確認することです。

Arrows a = (ArrowBottom | ArrowLeft);    
if (((a & ArrowBottom) == ArrowBottom) && ((a & ArrowLeft) == ArrowLeft)) {
    // arrow bottom-left
}

次のリファレンスでは、これが正しい理由を説明し、列挙型に関するその他の洞察を提供します。

参照:ビットマスクの値のチェック

于 2015-04-27T00:47:49.913 に答える
5

複合チェックを行うには、次のコードを使用できます。

if ((a & ArrowRight) && (a & ArrowTop)) {
       NSLog(@"arrow right and top code here");    
}
于 2014-07-25T21:22:56.690 に答える