整数乘以双精度并将结果存储为双精度
Multiplication of Integer by double and storing result as a double
出于好奇,在 swift:
var a:Double = 3.5
var b:Int = 4
var c = a * Double(b)
var d:Double = a * b
为什么 d
无效而 c
有效?由于我指定 d
是双精度数,编译器难道不应该检测到 b
应该转换为双精度数吗?
Swift 不进行自动类型转换,除非在非常精确的情况下,因此,在混合算术类型时,您必须明确处理转换。
在Swift中,你必须明确地convert类型,而不是cast它。 See the document.
Because each numeric type can store a different range of values, you must opt in to numeric type conversion on a case-by-case basis. This opt-in approach prevents hidden conversion errors and helps make type conversion intentions explicit in your code.
当你有b:Int
时,你可以Double(b)
,因为它是从Int
到Double
的转换,但你不能b as Double
或[=16] =] 因为它正在铸造。
至于 var d:Double = a * b
,问题是没有 *
运算符实现接受 Double
和 Int
作为操作数和 returns Double
.
如果需要,可以实现重载运算符:
func *(lhs:Double, rhs:Int) -> Double {
return lhs * Double(rhs)
}
var d:Double = a * b // -> 14
但我不建议这样做。您应该改为进行显式 conversion。
出于好奇,在 swift:
var a:Double = 3.5
var b:Int = 4
var c = a * Double(b)
var d:Double = a * b
为什么 d
无效而 c
有效?由于我指定 d
是双精度数,编译器难道不应该检测到 b
应该转换为双精度数吗?
Swift 不进行自动类型转换,除非在非常精确的情况下,因此,在混合算术类型时,您必须明确处理转换。
在Swift中,你必须明确地convert类型,而不是cast它。 See the document.
Because each numeric type can store a different range of values, you must opt in to numeric type conversion on a case-by-case basis. This opt-in approach prevents hidden conversion errors and helps make type conversion intentions explicit in your code.
当你有b:Int
时,你可以Double(b)
,因为它是从Int
到Double
的转换,但你不能b as Double
或[=16] =] 因为它正在铸造。
至于 var d:Double = a * b
,问题是没有 *
运算符实现接受 Double
和 Int
作为操作数和 returns Double
.
如果需要,可以实现重载运算符:
func *(lhs:Double, rhs:Int) -> Double {
return lhs * Double(rhs)
}
var d:Double = a * b // -> 14
但我不建议这样做。您应该改为进行显式 conversion。