在回答这个关于ceil()
在CGFloat上为所有架构进行编译的早期问题时,我提出了以下解决方案:
var x = CGFloat(0.5)
var result: CGFloat
#if arch(x86_64) || arch(arm64)
result = ceil(x)
#else
result = ceilf(x)
#endif
// use result
(针对那些已经感到困惑的人的背景信息:对于32位架构,CGFloat是“ float”类型,对于64位架构(即,编译目标),CGFloat是“ double”,这就是为什么仅使用其中之一ceil()
或ceilf()
不使用它的原因编译,具体取决于目标体系结构。请注意,您似乎无法CGFLOAT_IS_DOUBLE
用于条件编译,只能使用体系结构标志...)
现在,在有关在编译时与运行时修复问题等问题的评论中,这引起了一些辩论。我认为我的回答被接受的太快了,以至于无法引起对此的一些好的辩论。
因此,我的新问题是:如果您希望iOS和OS X代码在32位和64位设备上运行,那么上述操作是安全,明智的做法吗?而且,如果这是理智和明智的,那么还有更好的解决方案(至少有效,而不是“棘手”)吗?
马特
在您的解决方案的基础上,如果您在多个地方使用它,那么稍加扩展可能会使它更可口:
extension CGFloat {
var ceil: CGFloat {
#if arch(x86_64) || arch(arm64)
return ceil(x)
#else
return ceilf(x)
#endif
}
}
其余代码将更加简洁:
var x = CGFloat(0.5)
x.ceil
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句