我试着在Swift中添加Int
和Float
文字,它编译没有任何错误:
var sum = 4 + 5.0 // sum is assigned with value 9.0 and type Double
但是,当我试图对Int
和Float
变量做同样的事情时,我得到了一个编译时错误,我不得不将任何一个操作数类型转换为另一个操作数的类型以使其工作:
var i: Int = 4
var f:Float = 5.0
var sum = i + f // Binary operator '+' cannot be applied to operands of type 'Int' and 'Float'
为什么会这样?是否与类型安全有关?
如果你想要双重结果:
let i: Int = 4
let f: Float = 5.0
let sum = Double(i) + Double(f)
print("This is the sum:", sum)
如果你想要Int result:
let i: Int = 4
let f: Float = 5.0
let sum = i + Int(f)
print("This is the sum:", sum)
在var sum = 4 + 5.0
的情况下,编译器自动将4转换为浮点数,因为这是执行操作所需的。如果你写var x: Float = 4
,同样会发生。4会自动转换为浮点数。
在第二种情况下,由于您已经显式定义了变量的类型,编译器没有按照要求更改它的自由。
看@Fabio的答案
Swift.org上的文档说:
类型推断在声明具有初始值的常量或变量时特别有用。这通常是通过在声明常量或变量时为其赋一个文字值(或文字)来实现的。(文字值是直接出现在源代码中的值,例如下面示例中的42和3.14159)
例如,如果给一个新的常量赋值42没有说明是什么类型,Swift推断你想要常量必须是Int型,因为你已经用数字初始化了它它看起来像一个整数:
let meaningOfLife = 42 // meaningOfLife is inferred to be of type Int
同样,如果不指定浮点型文字的类型,Swift推断出你想创建一个Double:
let pi = 3.14159 // pi is inferred to be of type Double Swift always
在推断类型时选择Double(而不是Float)浮点数。
如果在表达式中同时使用整数和浮点字面值,则aDouble的类型将从上下文中推断:
> let anotherPi = 3 + 0.14159 // anotherPi is also inferred to be of
type Double: 3的字面值没有明确的in和of类型本身,因此可以从中推断出适当的Double输出类型浮点字面值作为加法的一部分。