列挙型を返すメソッドがあります。
-(EnumType)supportedEnum {
return EnumTypeA | EnumTypeB | EnumTypeC;
}
別の方法では、サポートされている列挙型に次のような特定の列挙型が含まれているかどうかを比較しています。
if ([Instance supportedEnum] == EnumTypeA) {
NSLog("Class contains EnumTypeA");
}
しかし、この条件はどういうわけか間違っているので、それは機能していません。私は何が間違っているのですか?
をオプションセットenum
として定義して使用しようとしているようです。これを行うには、最初にリテラルを2の累乗の値を持つように定義する必要があります。これは、基盤となるハードウェアがバイナリを使用するため、各値の値に1ビットが設定されていることを意味します。あなたはまたの基になる型を設定することができます:の一つに、、または; それぞれ最大8、16、32、または64のリテラルを持つことができます。例えば:enum
enum
uint8_t
uint16_t
uint32_t
uint64_t
enum
typedef enum : uint8_t
{
EnumTypeA = 0x1,
EnumTypeB = 0x2,
EnumTypeC = 0x4,
EnumTypeD = 0x8,
EnumTypeE = 0x10
} EnumType;
注:16進定数は、各値に1ビットのみが設定されていることをより明確に示すために使用されましたが、必要に応じて10進数(または8進数)を使用します。
注:Objective-Cは、NS_OPTIONS
オプションセットenum
の定義に役立つマクロも提供します。これを使用するかどうかは選択の問題です。Swiftを使用して相互運用する場合は、Swiftを使用することをお勧めします。使用方法については、Appleのドキュメントを参照してください。
リテラルを組み合わせて、ビット単位を使用して設定値を生成します-または、|
メソッドで行ったように:
- (EnumType)supportedEnum
{
return EnumTypeA | EnumTypeB | EnumTypeC;
}
これは、EnumType
正確に3ビットが設定されたの値を返します。
存在する特定の値をテストするには、ビット単位で使用します&
。たとえば、次のようになります。
if ([instance supportedEnum] & EnumTypeA)
{
NSLog("Class contains EnumTypeA");
}
これif
は、述語式がゼロに等しくないことのテストとして機能します(これは、if
ブール値の述語ではなく、整数値の述語を使用するという(Objective-)Cの特殊性です)。
enum
リテラルのセットのいずれか1つ以上が存在するかどうかをテストする場合は、ビット単位のandおよびorを組み合わせます。たとえば、テストする、EnumTypeA
および/またはEnumTypeC
次のように記述します。
if ([instance supportedEnum] & (EnumTypeA | EnumTypeC) ) ...
存在するリテラルのセットをすべてテストするには、等価比較を追加する必要があります。例えば:
if ( ([instance supportedEnum] & (EnumTypeA | EnumTypeC)) == (EnumTypeA | EnumTypeC) ) ...
両方のテストEnumTypeA
とEnumTypeC
。
ビットごとのand、or、xorおよびinverse演算子、それらの複合代入バージョン、および(不)等式演算子を使用して、enum
値の個々のリテラルを設定またはクリアできます。ユニオンなど2つ以上の値。リテラルの存在/設定および/または不在/クリアの組み合わせをテストします。
HTH
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加