- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在将一个应用程序转换为在 64 位上运行。 Apple 文档声明 CGFloat
类型在 32 位上是一个 float
,在 64 位上是一个 double
。
如果是这样,您如何处理值的编码/解码?例如,如果从 CGFloat
创建一个 NSNumber
,我应该使用 -numberWithFloat:
还是 -numberWithDouble:
NSNumber的方法?同样的问题适用于 NSCoder
和 NSKeyedArchiver
方法 -encodeFloat:forKey:
和 -encodeDouble:forKey:
。
我是否必须编写条件宏以便在 32 位上调用 -numberWithFloat:
并在 64 位上调用 -numberWithDouble:
?
如果运行 64 位版本应用程序的用户保存了一个文件,其中这些值被编码为 double 值,并且该文件在 32 位系统上打开/取消存档,会发生什么情况?
我的应用程序中所有使用 CGFloats
的方法都不太可能需要 double
的精度级别,所以我应该为此担心吗?
最佳答案
What happens if a user running the 64-bit version of the app saves a file where these values are encoded as doubles and the file is opened/unarchived on a 32-bit system?
没什么特别的。该文件包含一个 double
,并且您可能正在发送 decodeDouble:forKey:
来检索该值,因此您将获得一个 double
。然后您可以将其转换为 CGFloat
——如果您使用的是 32 位机器,这将失去精度,但您迟早必须进行转换。 (即使您保留 double
,当您将值传递给 Quartz/AppKit/UIKit 时,您仍然必须转换为 CGFloat
。)
考虑替代方案:您将 float
存储在 64 位机器上的文件中,然后将文件加载回同一台机器上。您和 Quartz 可以处理 64 位 double
类型的完整精度,但您没有,因为您在写出文件时将其丢弃。如果值在转换中完全改变,则该更改现在是永久性的。
所以我的建议是始终将 double
类型与 NSKeyedArchiver 一起使用,除非您知道您永远不会使用除float
之外的任何类型(即,目标 API 仅使用 float
,从不使用 double
)。 Quartz 不是这样,因此对于 CGFloat
,请使用 double
。
关于objective-c - 在 32 位和 64 位上编码/解码 CGFloat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1746388/
我试图随机生成 CGFloat 但不知道它是如何在 swift 3 中完成的。什么是 CGFloat.random(min: CGFloat, max: CGFloat) 相当于 swift 2 的
我收到一个错误,我不知道如何修复。错误是: Sending 'CGFloat' (aka 'float') to parameter of incompatible type 'CGFloat *'
我有一个自动布局便利功能,可以将 View 堆叠在彼此之上。对于我的间距参数,我想允许: View 之间的间距为零 或单个CGFloat(所有 View 均匀分布) 或 CGFloat 数组( Vie
尝试设置 CAShapeLayer 的 zPosition 时出现错误。这是代码: self.view.layer.sublayers[l].zPosition = CGFloat(1) 出于某种原因
我有一个像 CGFloat 数组 [[[1,2],[2,3]],[[6,1],[5,6]],[[6,1],[11,6],[21,3]]] 不,我想合并子数组并在每个子数组中添加数组数据,如 [[1,2
我有这个代码: let startX = CGFloat(arc4random_uniform(maxX + (quarterX*2))) - quarterX quarterX 是一个 CGFloa
我在 XCode 6 beta 4 上使用 swift 时遇到问题,这让我发疯 我正在 IOS 8 中开发游戏并且我遵循了教程但我得到了这个:Float is not convertible to C
我正在尝试使用 CGRect.insetBy( dx : ... , dy : ...) 但是代码给了我一个根本无法解决的错误。 func scaleRect (rect: CGRect , xSca
我不太理解这个编译错误,因为我没有得到这个错误并且可以在真实设备上编译和运行,但是如果我尝试在模拟器上构建和运行我会得到这个错误。 Cannot invoke initializer for type
我有一个简单的例子,我尝试画一个圆。下面这段代码没有给我一个圆圈。 import UIKit class PlayingCardView: UIView { override func dra
我正在尝试转换使用 Facebook's pop library 的 ObjC 类 swift 。 Pop 使用了相当多的 C。 在 ObjC 中,我有一个看起来像这样的 block ...... p
我必须将我的整数包装在 CGFloat() 中才能在 Swift 2.3 中编译 如果我只执行 * 2,那么它会编译。为什么会这样?这在 Swift 3 中已修复吗? var multiplier =
我正在尝试创建一个带有CGFloat参数并返回CGFloat的块变量。 CGFloat (^debt)(CGFloat) = ^(CGFloat myFloat) { return myFloa
label.position = CGPointMake(self.size.width*0.125, self.size.height-CGFloat(0.15)*self.size.height*
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
如果这说明了问题,这里是原始的 Objective-C 代码。 int x = (arc4random()%(int)(self.gameView.bounds.size.width*5)) - (i
我正在尝试将 Float 值转换为 CGFloat 值,这里是我的代码: let myFloatForR = 0 let r = CGFloat(myFloatForR) le
我是 sprite kit 2d 游戏开发的新手。现有的 swift2 项目运行良好,但不幸的是更新 swift4 后流动代码出现错误。我该如何解决这个问题 class SGScene : SKSce
我的 .h 类中有以下内容: extern CGFloat tableMarginSide; extern CGFloat tableMarginTop; extern CGFloat fromIma
在我的 CGFloat 包装器中,我收到一个错误 Returning CGFloat (aka Double) from a function result type CGfloat aka doub
我是一名优秀的程序员,十分优秀!