在使用ceil或round时对成员的引用模棱两可

我只是想在Swift中使用ceilround函数,但得到一个编译时错误:

对成员“ceil”的模糊引用。

我已经导入了FoundationUIKit模块。 我试图编译它有和没有import陈述,但没有运气。 有没有人有任何想法我做错了什么? 我的代码如下;

 import UIKit @IBDesignable class LineGraphView: GraphView { override func setMaxYAxis() { self.maxYAxis = ceil(yAxisValue.maxElement()) } } 

这个问题首先会出现,看起来很奇怪,但是很容易解决。

简单地说,你可能会认为调用ceil()会将浮点数四舍五入到最接近的整数,但实际上它根本不返回一个整数:如果给它一个Float它将返回一个Float ,如果你给它Double返回一个Double

所以,这个代码工作,因为c最终是一个Double

 let a = 0.5 let c = ceil(a) 

…而这段代码导致你的确切的问题,因为它试图强制一个Double进入一个没有types转换的Int

 let a = 0.5 let c: Int = ceil(a) 

解决方法是将ceil()的返回值转换为整数,如下所示:

 let a = 0.5 let c = Int(ceil(a)) 

round()函数也是如此,所以你需要相同的解决scheme。

根据你调用ceil ,你可能需要明确地调用Darwinceil函数(深入封闭等)。 达尔文是通过UIKit导入的Foundation导入的。

 let myFloat = 5.9 let myCeil = Darwin.ceil(myFloat) // 6 

在linux上, Glibc被用来代替Darwin的C级API访问。 您将不得不显式import Glibc并调用Glibc.ceil(myFloat)而不是使用Darwin