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 系の処理を検討するのも良いのかもしれないですね。
[ もどる ]