2013-06-12 3 views
10

CGFloatNSNumber으로 "변환"하는 안전한 방법이 있습니까?CGFloat의 NSNumber

NSNumbernumberWithFloat:numberWithDouble: 방법을 가지고 있지만 CGFloatfloat 또는 double는 플랫폼에 따라 정의되고, 그것은 그들 중 하나를 사용하는 것이 위험 보인다.

정확도가 더 높은 것인데 CGFloat과 함께 사용하는 것이 안전하거나 numberWithDouble:과 함께 사용하는 것이 안전합니까?

+3

, 단지 * @ (myNumber) * 작성하고 그것을에서 해결됩니다 컴파일 시간. 그러나 * [NSNumber numberWithDouble : myNumber] *를 안전하게 호출 할 수 있습니다. * CGFloat *가 올바르게 정의 된 경우 * CGFloat *는 여전히 고정 소수점을 잃지 않은 부동 소수점으로 정의됩니다. –

+0

안전합니까? 설명 할 수 있니? –

+2

"정밀 손실없이"안전합니다. 이게 내가 왜 엎드린거야? –

답변

29

나는 @NSNumber 문자가 충분 생각

@(myCGFloat) 

자세한 내용은 여기 읽기 : 당신이 충분히 높은 컴파일러 버전이있는 경우 http://clang.llvm.org/docs/ObjectiveCLiterals.html

+0

솔루션 및 링크를 제공해 주셔서 감사합니다. 이것은 계몽했다 :) –

20

이 내가 그것을 처리하는 방법입니다

@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에 정의되어 있습니다.

+0

이것은 필요하지 않습니다. 오버 코딩입니다. * [NSNumber numberWithDouble : value] * (리터럴 숫자를 지원하지 않는 컴파일러 버전의 경우)를 호출하면 숫자가 부동 또는 실수인지 여부에 관계없이 정밀도가 손실 될 위험이 없습니다. –

+0

예, CGFloat가 부동 소수 인 플랫폼에서는 float와 double 사이를 변환하는 데 낭비합니다. 그러나 어쨌든. 이것을 사용하지 마십시오. 나는 그것을 오래 전에 썼다. 그리고 나는 그것을 계속 사용한다. 그것은 나를 위해 작동합니다. – ipmcc

+0

Thnaks @ipmcc, 나는 Lukas의 솔루션을 사용 하겠지만 당신의 것이 내가 원래 찾고 있던 것입니다. –