2013-06-12 2 views
10

CGFloatNSNumberに「変換する」安全な方法はありますか?CGFloatからのNSNumber

NSNumbernumberWithFloat:numberWithDouble:メソッドを持っていますが、CGFloatは、プラットフォームに依存しfloatまたはdoubleとして定義されている、それらのいずれかを使用することは危険と思われます。

さらに精度が高いので、CGFloatと一緒に使用しても安全ですか?numberWithDouble:ですか?

@interface NSNumber (CGFloatAdditions) 

+ (NSNumber*)numberWithCGFloat: (CGFloat)value; 
- (CGFloat)CGFloatValue; 

@end 

@implementation NSNumber (CGFloatAdditions) 

+ (NSNumber*)numberWithCGFloat: (CGFloat)value 
{ 
#if CGFLOAT_IS_DOUBLE 
    return [NSNumber numberWithDouble: (double)value]; 
#else 
    return [NSNumber numberWithFloat: value]; 
#endif 
} 

- (CGFloat)CGFloatValue 
{ 
#if CGFLOAT_IS_DOUBLE 
    return [self doubleValue]; 
#else 
    return [self floatValue]; 
#endif 
} 


@end 

CGFLOAT_IS_DOUBLEはプラットフォームによって条件付きCGBase.hに定義されています。

+3

あなたが十分に高いコンパイラのバージョンをお持ちの場合は、単に* * @(myNumber)を書いて、それがで解決されますコンパイル時。しかし、* [NSNumber numberWithDouble:myNumber] *を安全に呼び出すことができます。* CGFloat *が二重に定義されている場合、* CGFloat *は浮動小数点として定義されています。 –

+0

安全?説明できますか? –

+2

「精度の低下なし」として安全です。私はなぜ落選したのですか? –

答えて

29

私は@NSNumberリテラルはもっとここで読む

@(myCGFloat) 

十分であると考えている:http://clang.llvm.org/docs/ObjectiveCLiterals.html

+0

ソリューションとリンクをありがとう。これは啓発されていた:) –

20

これは、私はそれをどのように処理したかです。

+0

これは必要でもなく、オーバーコードです。 * [NSNumber numberWithDouble:value] *(リテラル番号をサポートしないコンパイラバージョンの場合)を呼び出すと、数値が浮動小数点数であっても倍精度であれ、精度を失うことはありません。 –

+0

はい、CGFloatが浮動小数点型のプラットフォームではfloatとdoubleの間の変換に時間がかかります。しかし、何でも。これを使用しないでください。私はずっと前にそれを書いており、私はそれを使い続けています。わたしにはできる。 – ipmcc

+0

Thnaks @ipmcc、私はルーカスのソリューションを使用しますが、あなたのものは私が元々探していたものです。 –