为什么写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
的哪个版本.
在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
的哪个版本.