2013-06-12 20 views
10

CGFloat'u NSNumber'a "dönüştürmek için güvenli bir yol var mı?NSNumber from CGFloat

NSNumbernumberWithFloat: ve numberWithDouble: yöntem vardır, ancak CGFloatfloat veya double platformuna bağlı olarak tanımlanır, bunlardan birini kullanma riskli görünmektedir.

Ya da CGFloat ile kullanmak daha güvenlidir, daha hassas olanı olduğu gibi numberWithDouble: güvenli midir?

+3

, sadece * @ (MyNumber) * yazma ve en çözülecektir Derleme zamanı. Bununla birlikte * [NSNumber numberWithDouble: myNumber] * 'ı, * CGFloat *' ın doğru olarak iki katı olarak tanımlanması durumunda, * CGFloat * 'ın hala herhangi bir hassasiyeti kaybetmediğiniz için açıklandığı tanımlanır. –

+0

güvenli? açıklayabilir misin? –

+2

"hassas kayıp olmadan" güvenli. Bu yüzden mi reddedildi? –

cevap

29

Ben @NSNumber literal yeterince iyi olduğuna inanıyoruz

@(myCGFloat) 

Devamı burada: Bir yeterince yüksek derleyici sürümü varsa http://clang.llvm.org/docs/ObjectiveCLiterals.html

+0

Çözüm ve bağlantı için teşekkürler. Bu aydınlatıcı oldu :) –

20

Bu onu nasıl ele geçerli:

@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 şartlı platform tarafından CGBase.h tanımlanmıştır.

+0

sordum Bu bile gerekli değil, aşırı kodlama. * [NSNumber numberWithDouble: value] * olarak adlandırırsanız (tam sayıları desteklemeyen derleyici sürümleri için), sayı float veya double olup olmadığını kesin olarak kaybetme riski yoktur. –

+0

Evet, ancak CGFloat'ın bir kayan olduğu float ve çift platformlar arasında dönüşüm yapmak için döngüleri boşa harcıyorsunuz. Fakat herneyse. Bunu kullan, bunu kullanma. Uzun zaman önce yazdım ve kullanmaya devam ediyorum. Benim için çalışıyor. – ipmcc

+0

Thnaks @ipmcc, Lukas'ın çözümünü kullanacağım ama senin için orijinal olarak aradığım şey. –