在回答这个关于ceil()在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
(针对那些已经感到困惑的人的背景信息:对于32位架构,CGFloat是“ float”类型,对于64位架构(即,编译目标),CGFloat是“ double”,这就是为什么仅使用其中之一ceil()或ceilf()不使用它的原因编译,具体取决于目标体系结构。请注意,您似乎无法CGFLOAT_IS_DOUBLE用于条件编译,只能使用体系结构标志…)
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