Ambiguous reference to member when using ceil or round

此生再无相见时 提交于 2019-12-22 10:30:32

问题


I am just trying to use the ceil or round functions in Swift but am getting a compile time error:

Ambiguous reference to member 'ceil'.

I have already imported the Foundation and UIKit modules. I have tried to compile it with and without the import statements but no luck. Does anyone one have any idea what I am doing wrong? my code is as follow;

import UIKit

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

    }
   }

回答1:


This problem occurs for something that might seem strange at first, but it's easily resolved.

Put simply, you might think calling ceil() rounds a floating-point number up to its nearest integer, but actually it doesn't return an integer at all: if you give it a Float it returns a Float, and if you give it a Double it returns a Double.

So, this code works because c ends up being a Double:

let a = 0.5
let c = ceil(a)

…whereas this code causes your exact issue because it tries to force a Double into an Int without a typecast:

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

The solution is to convert the return value of ceil() to be an integer, like this:

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

The same is true of the round() function, so you'd need the same solution.




回答2:


Depending on the scope of where you call ceil, you may need to explicitly call Darwin's ceil function (deep in a closure, etc). Darwin is imported through Foundation, which is imported by UIKit.

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

On linux, Glibc is used in place of Darwin for C-level API access. You would have to explicitly import Glibc and call Glibc.ceil(myFloat) instead of using Darwin.



来源:https://stackoverflow.com/questions/34357739/ambiguous-reference-to-member-when-using-ceil-or-round

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!