CFNumber 型の値を NSInteger 型で取得する。 - Objective-C プログラミング

PROGRAM


CFNumber 型の値を NSInteger 型で取得する。

Objective-C で、CFNumber 型で取得した値を NSInteger 型に変換する方法について記してみます。

たとえば プロパティリストオブジェクト の値を NSDictionary 変数に取り込む ようなことをした場合、取得された数値データは CFNumber 型で取得されるので、必要に応じて NSInteger 型等へ変換する必要があります。

CFNumber 用の C 関数を使って取得する場合

例えば "value" という名前の CFNumberRef 型の変数に保存した CFNumber の値は、"CFNumberGetValue" 関数を使用して、次のように値を取得することができます。

// 引数に渡された CFNumber 型の値を NSInteger 型で返す関数です。

- (NSInteger) getNumberAsInteger:(CFNumberRef)value

{

NSInteger result;

 

// CFNumber から NSInteger を取得しています。

CFNumberGetValue(value, kCFNumberNSIntegerType, &result);

 

// ここでは、取得した値を戻り値としています。

return result;

}

このような感じで、NSInteger 型として取得することができました。

CFNumberGetValue 関数の第二引数を次のように変えることで、他のデータ型としても取得することができるようになっています。

kCFNumberSInt8Type SInt8
符号付き 8 ビット整数
kCFNumberSInt16Type SInt16
符号付き 16 ビット整数
kCFNumberSInt32Type SInt32
符号付き 32 ビット整数
kCFNumberSInt64Type SInt64
符号付き 64 ビット整数
kCFNumberFloat32Type Float32
32 ビット浮動小数点数
kCFNumberFloat64Type Float64
64 ビット浮動小数点数
kCFNumberCharType char
C 言語でいう char 型の値
kCFNumberShortType short
C 言語でいう short 型の値
kCFNumberIntType int
C 言語でいう int 型の値
kCFNumberLongType long
C 言語でいう long 型の値
kCFNumberLongLongType long long
C 言語でいう long long 型の値
kCFNumberFloatType float
C 言語でいう float 型の値
kCFNumberDoubleType double
C 言語でいう double 型の値
kCFNumberCFIndexType CFIndex 型の値
kCFNumberNSIntegerType NSInteger 型の値
Mac OS X v10.5 以上で使用できるそうです。
kCFNumberCGFloatType CFGloat 型の値
Mac OS X v10.6 以上で使用できるそうです。

トールフリーブリッジを使って NSNumber に変換した場合

Objective-C では CFNumber を NSNumber にキャストすることで、簡単に値を取得することができます。

// 引数に渡された CFNumber 型の値を NSInteger 型で返す関数です。

- (NSInteger) getNumberAsInteger:(CFNumberRef)value

{

NSInteger result;

 

// CFNumber を NSNumber にキャストして NSInteger を取得しています。

result = [(NSNumber*)value integerValue];

 

// ここでは、取得した値を戻り値としています。

return result;

}

このような感じで、簡単に数値を取り出すことができました。

C 言語の CFNumberGetValue 関数を使った方法と、この Objective-C 言語のトールフリーブリッジを使った方法と、どちらでも正しい解が得られますけど、Objective-C でプログラムを組んでいるのであれば、こちらのトールフリーブリッジによる方法の方が、自然な感じに思えます。

もっとも、C 言語の方が処理速度が速いという話もありましたので、速度的にシビアなところでは、もしかすると CF 系の処理を検討するのも良いのかもしれないですね。

[ もどる ]