Clangのプリミティブボクシング機能を使用して列挙型メンバーをにパックしていますNSNumber
これに関するClangドキュメントのBoxedEnumsセクションでは、型が指定されていない限り、コンパイラーは列挙型メンバーを整数にボックス化すると述べています。
おかしなことに、列挙型メンバーをメソッドに渡す方法に応じて、さまざまなサイズの整数を取得します。私は次のコードにケースを分離することができました
typedef enum _MyEnum {
MyEnumMember1 = 1000
} MyEnum;
- (void)testEnumerationBoxing
{
NSNumber *numberA = [self testA];
NSNumber *numberB = [self testB:MyEnumMember1];
CFNumberType numberTypeA = CFNumberGetType((__bridge CFNumberRef) numberA);
CFNumberType numberTypeB = CFNumberGetType((__bridge CFNumberRef) numberB);
NSLog(@"CF Number type for A: %lu; B: %lu", numberTypeA, numberTypeB);
}
- (NSNumber *)testA
{
return @(MyEnumMember1);
}
- (NSNumber *)testB:(MyEnum)enumMember
{
return @(enumMember);
}
コンソール出力は
AのCF番号タイプ:3; B:4
(最初のものはkCFNumberSInt32Type
、2番目のものはですkCFNumberSInt64Type
)
宣言をに変更するtypedef enum _MyEnum : int
と、両方で同じ結果が表示されますkCFNumberSInt32Type
。
ボクシングの2つの方法で整数のサイズが異なるのはなぜですか?