2013-06-12 26 views
10

Có cách nào an toàn để "chuyển đổi" số CGFloat thành NSNumber không?NSNumber từ CGFloat

NSNumber có phương pháp numberWithFloat:numberWithDouble: nhưng CGFloat được định nghĩa là float hoặc double tùy thuộc vào nền tảng này, có vẻ như rủi ro để sử dụng hoặc một trong số họ.

Hoặc là numberWithDouble: an toàn để sử dụng với CGFloat, vì đây là thiết bị có độ chính xác cao hơn?

+3

Nếu bạn có đủ phiên bản trình biên dịch cao, chỉ cần viết * @ (myNumber) * và nó sẽ được giải quyết tại thời gian biên dịch. Tuy nhiên bạn có thể gọi một cách an toàn * [NSNumber numberWithDouble: myNumber] *, nếu * CGFloat * được định nghĩa là gấp đôi bạn làm điều đó một cách chính xác, nó * CGFloat * được định nghĩa là phao bạn vẫn chưa mất bất kỳ độ chính xác nào. –

+0

an toàn? bạn có thể giải thích? –

+2

an toàn là "không bị mất chính xác". Đây có phải là lý do tôi bị downvoted không? –

Trả lời

20

Đây là cách tôi xử lý nó:

@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 được định nghĩa trong CGBase.h có điều kiện theo nền tảng.

+0

Điều này thậm chí không cần thiết, nó quá mã hóa. Nếu bạn gọi * [NSNumber numberWithDouble: value] * (đối với các phiên bản trình biên dịch không hỗ trợ chữ số), bạn không có nguy cơ bị mất bất kỳ độ chính xác nào cho dù số đó là phao hay gấp đôi. –

+0

Có, nhưng bạn lãng phí các chu kỳ để chuyển đổi giữa float và double trên các nền tảng mà CGFloat là một phao. Nhưng bất cứ điều gì. Sử dụng cái này, đừng dùng cái này. Tôi đã viết nó từ lâu rồi và tôi tiếp tục sử dụng nó. Nó làm việc cho tôi. – ipmcc

+0

Thnaks @ipmcc, tôi sẽ sử dụng giải pháp của Lukas nhưng đó là giải pháp tôi đang tìm kiếm ban đầu. –

Các vấn đề liên quan