为什么写acos(1.0)可以写acos(1)不行?

时间:2015-02-28 13:14:43

标签: swift foundation

在Swift中,如果你有两个变量:

var a:Int = 2
var b:Double = 3.4

如果你试图这样做:

var c = a+b

它将触发编译时错误,因为您无法添加两个不同类型的变量。

但是,你仍然可以这样做:

var c = b+2

它会起作用,因为2本身没有任何类型,所以即使它不是十进制数(我的意思是,我不写2.0),它仍然有效。

现在,我的问题是,为什么当我这样做时,同样的原则不适用:

acos(1) 

但是当我这样做时它会起作用:

acos(1.0)  

我看到acos()可以将Double,Float和CGFloat作为参数,但不应该Xcode推断1实际上是Double?

2 个答案:

答案 0 :(得分:3)

这是一个有趣的问题。请注意,如果我定义自己的myAcos函数Double,我可以使用myAcos(1)调用它:

func myAcos(d: Double) -> Double {
    return 0.0
}

let a = myAcos(1)   // This works

现在,如果我添加第二个myAcos,则会返回Float

func myAcos(f: Float) -> Float {
    return 0.0
}

myAcos(1)的调用现在给出错误:错误:模糊地使用'myAcos'

然后,我添加了第三个函数myAcos,它接受​​并返回CGFloat

func myAcos(c: CGFloat) -> CGFloat {
    return 0.0
}

myAcos(1)的调用会出现错误:错误:无法找到接受所提供参数的'myAcos'的重载

如果我再添加第四个myAcos函数并返回Int,那么myAcos(1)就可以了:

func myAcos(i: Int) -> Int {
    return 0
}

myAcos(1)  // This works, again

因此,您的问题的答案似乎是您无法致电acos(1),因为Swift无法确定您试图呼叫的acos版本。

答案 1 :(得分:1)

语言规范定义(参见Language Reference中的文字)1是一个整数文字而Swift不允许隐式类型转换。

这是有充分理由的,因为它使表达式像

3 / 2 

更明确。