【发布时间】:2014-06-12 12:46:48
【问题描述】:
在回答 this earlier question 关于在 CGFloat 上使用 ceil() 以针对所有架构进行编译时,我提出了一个解决方案:
var x = CGFloat(0.5)
var result: CGFloat
#if arch(x86_64) || arch(arm64)
result = ceil(x)
#else
result = ceilf(x)
#endif
// use result
(对于那些已经感到困惑的人的背景信息:CGFloat 是 32 位架构的“浮点”类型,64 位架构(即编译目标)的“双”类型,这就是为什么只使用 ceil() 或ceilf() 它不会总是编译,具体取决于目标架构。请注意,您似乎无法使用 CGFLOAT_IS_DOUBLE 进行条件编译,只有架构标志...)
现在,这在 cmets 中引起了一些关于在编译时与运行时修复问题的争论,等等。我认为我的回答被接受得太快了,以至于无法引起关于这个问题的一些好的辩论。
所以,我的新问题是:如果您希望您的 iOS 和 OS X 代码在 32 位和 64 位设备上运行,上述操作是否安全且明智?如果它是理智和明智的,还有更好的(至少同样有效,而不是“恶心”)的解决方案吗?
【问题讨论】:
-
真正的解决方案是提交错误报告。这种事情不应该是必要的。 Swift 需要更宽容、更智能的数字。
-
@matt 好吧,公平地说,CGFloat 实际上不是 Swift 类型,它是 Core Graphics 类型。 Swift 的 Float 始终是 32 位的,Swift 的 Double 始终是 64 位的。并且有充分的理由(性能、内存使用、精度)希望在一种语言中同时使用两者。
-
他们知道在这方面与 Core Graphics 类型的交互会很常见。语言需要使这种交互变得容易。它应该设计用于 Cocoa。
-
@matt 好吧,这只是一个测试版。你养过雷达吗?我已经看到这个问题出现了很多,所以我相信你是对的,应该有一种更简单的方法来处理它。我问这个问题的部分原因是我想知道我是否错过了一种更简单的方法......
-
只需将这些检查包装在 CGFloatCeil() 中
标签: swift