在分配变量与二元运算符时,是否存在不同的类型推断策略?
let arrayOfInts = [1,2,3]
let arrayOfDoubles = [1.0, 2.0, 3.0]
// arrayOfInts == arrayOfDoubles
// Binary operator '==' cannot be applied to ... [Int] [Double]
[1,2,3] == [1.0, 2.0, 3.0] // works?
答案 0 :(得分:3)
对于arrayOfInts
,编译器默认情况下将整数文字推断为类型Int
。因此arrayOfInts
是[Int]
。对于arrayOfDoubles
,编译器默认情况下会将浮点文字推断为类型Double
。因此arrayOfDoubles
属于[Double]
类型。您无法将[Int]
与[Double]
进行比较(至少不能与标准库==
的重载进行比较),因此您将收到编译错误。
但是,使用表达式[1, 2, 3] == [1.0, 2.0, 3.0]
- Swift可以将两者的浮点和整数文字推断为类型Double
,因为Double
符合两者ExpressibleByIntegerLiteral
和ExpressibleByFloatLiteral
。因此,您需要将[Double]
与[Double]
进行比较 - 合法。