在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?
答案 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)