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

Why is it okay to write acos(1.0) but not okay to write acos(1)?

在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 吗?

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

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

3 / 2 

更加明确。

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

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

let a = myAcos(1)   // This works

现在,如果我添加第二个 myAcos 和 returns 一个 Float:

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

调用 myAcos(1) 现在给出错误:错误:'myAcos'

的使用不明确

然后,我添加了第三个函数 myAcos 并且 returns a CGFloat:

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

调用 myAcos(1) 然后给出错误:错误:找不到接受提供的参数的 'myAcos' 的重载

如果我然后添加第四个 myAcos 函数,该函数接受 returns 一个 Int,那么 myAcos(1) 有效:

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

myAcos(1)  // This works, again

因此,您的问题的答案似乎是您无法调用 acos(1),因为 Swift 无法确定您尝试调用的 acos 的哪个版本.