使用 ceil 或 round 时对成员的引用不明确

Ambiguous reference to member when using ceil or round

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

Ambiguous reference to member 'ceil'.

我已经导入了 FoundationUIKit 模块。我曾尝试使用和不使用 import 语句来编译它,但没有成功。有谁知道我做错了什么? 我的代码如下;

import UIKit

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

    }
   }

根据您调用 ceil 的范围,您可能需要显式调用 Darwinceil 函数(在闭包深处等)。 Darwin 通过 Foundation 导入,通过 UIKit.

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

在 linux 上,Glibc 代替 Darwin 用于 C 级 API 访问。您必须显式 import Glibc 并调用 Glibc.ceil(myFloat) 而不是使用 Darwin.

这个问题起初看起来很奇怪,但很容易解决。

简而言之,您可能认为调用 ceil() 会将浮点数四舍五入为最接近的整数,但实际上它 return 根本不是整数:如果您给它一个Float 它 return 是 Float,如果你给它一个 Double 它 return 就是 Double.

因此,此代码有效,因为 c 最终成为 Double:

let a = 0.5
let c = ceil(a)

…而此代码会导致您的确切问题,因为它试图在没有类型转换的情况下将 Double 强制转换为 Int

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

解决方法是将ceil()的return值转换为整数,像这样:

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

round()函数也是如此,因此您需要相同的解决方案。