编码/在32位VS解码CGFloat的64位
-
20-09-2019 - |
题
我转换一个应用程序以64位的工作。苹果文档状态下CGFloat
类型是32位的一个float
和在64位一double
。
如果是这样的话,你如何处理的值的编码/解码?举例来说,如果从NSNumber
创建CGFloat
,我应该使用的NSNumber的-numberWithFloat:
或-numberWithDouble:
方法?同样的问题适用于NSCoder
和NSKeyedArchiver
方法-encodeFloat:forKey:
和-encodeDouble:forKey:
。
我必须写一个条件宏使得-numberWithFloat:
被称为在32位和-numberWithDouble:
在64位?
如果运行该应用程序的64位版本的一个用户保存,其中这些值被编码为一个双打文件和文件打开/未归档在32位的系统上?,会发生什么
在我的应用程序使用CGFloats
所有方法都是不可能永远需要一个double
的精度水平,所以我应该甚至担心这个?
解决方案
如果运行该应用程序的64位版本的一个用户保存,其中这些值被编码为一个双打文件和文件打开/未归档在32位的系统上?,会发生什么
没有什么特别的。该文件包含一个double
,想必你发送decodeDouble:forKey:
检索值,所以你会得到一个double
。然后,您可以将它转换到CGFloat
,其中,如果你是一个32位的机器上会失去精度,但你必须这样做投迟早的事。 (即使你不放double
,你还是要投当你通过价值石英/ AppKit的/ UIKit的到CGFloat
。)
考虑替代:您存储float
s在64位机器上的文件中,然后加载文件备份在同一台机器上。你和石英可以处理64位double
型的全精度,但你没有拥有它,因为你把它扔了,当你写出来的文件。如果该值在铸造变化在所有的,即改变现在是永久的。
所以我的建议是始终使用double
类型与的NSKeyedArchiver,除非你知道你的从不的打算使用任何东西,但float
(即目标API只使用float
,从来没有double
)。这不是石英的真,所以对于CGFloat
,使用double
。