web-dev-qa-db-ja.com

Obj-Cの複数値列挙型

CocoaおよびCocoaTouchフレームワークでは、列挙型が定数として使用されます。 |演算子を使用して複数の値をパラメーターとして渡すことができる場合を除いて、使用方法を理解しています。のように :

pageControl.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin);

列挙型は次のように宣言されます。

enum {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NSUInteger UIViewAutoresizing;

このタイプの列挙型(つまり、<<の意味)を自分で定義するにはどうすればよいですか?また、パラメーターとして渡されたときに複数の値を確認するにはどうすればよいですか?

48
gcamp

<<はビットシフト演算子です。したがって、1 << 2は、ビットを2スペースシフトするように指示します。

例:

2進数では、番号1は次のとおりです。

0001

1 << 2は、すべてのビットを左に2スペースシフトすることを意味します。これにより、次の値になります。

0100

または4

したがって、この例の各ENUMの値は、1、2、4、8、16などです。各列挙型をこれらの値に設定することもできます。しかし、それらは複数の値にその列挙型を使用するため、バイナリ値はそれをより明確にします。

0001
0010
0100
1000

それで彼らはビットシフトを使って書いた。

したがって、I OR(|)の場合、これらの値の2つを一緒に、たとえばFlexibleLeftMargin0001)とFlexibleWidth(0010) 、次の値を取得します。

0011

したがって、各ビットをフラグとして使用して、複数の値が設定されていることを認識します。

AND演算子&を使用して、特定の値が設定されているかどうかを確認できるようになりました。

0010 & 0011 = 0010

したがって、これを実行して、列挙型の1つが設定されているかどうかを確認できます。

myenum = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin);
if((myenum & UIViewAutoresizingFlexibleLeftMargin) == UIViewAutoresizingFlexibleLeftMargin) {
  // myenum has UIViewAutoresizingFlexibleLeftMargin set!
}

うまくいけば、これは理にかなっています。ビット演算の詳細については、次をお読みください: Wikipedia〜ビット演算子 または「 ビット演算子 "」を検索してください

114
Joel

<<は左シフト演算子です。つまり、左の値をNビット左に移動します。この場合、列挙型に単一ビット(ビット1、2、3、4、5)を設定しているため、ビット単位のOR演算子(|)値を組み合わせる。

1
Yann Ramin