【问题标题】:Need help on type inference in swift需要快速类型推断方面的帮助
【发布时间】:2017-07-19 11:16:54
【问题描述】:

当我阅读有关 swift 类型推断的信息时,我开始知道 swift 足够聪明,可以了解数据类型

就像我写这个程序的时候

var v3 = 2+2.5
print("the result is \(v3)")

然后我看到输出

the result is 4.5

但是当我写这个程序时

var v1 = 2.5
var v2 = 2
var v3:Double = v1 + v2
print("the result is \(v3)")

然后它给了我这个错误

ERROR at line 7, col 20: binary operator '+' cannot be applied to operands of type 'Double' and 'Int'
var v3:Double = v1 + v2
                ~~ ^ ~~
NOTE at line 7, col 20: expected an argument list of type '(Double, Double)'
var v3:Double = v1 + v2

谁能解释一下这里发生了什么

我已经在 IBM 沙盒上完成了这个程序

【问题讨论】:

标签: swift swift3 type-inference


【解决方案1】:

当你编写var v3 = 2+2.5 时,Swift 必须推断2 的类型,这是一个与IntDouble 兼容的数字文字。编译器能够这样做,因为在同一个表达式中有2.5,即Double。因此,编译器得出结论2 也必须是Double。编译器计算总和,并将v3 设置为4.5。运行时不执行任何添加。

当您编写var v2 = 2 时,编译器将2 视为Int,同时生成v1Int。现在在var v3:Double = v1 + v2 上有一个添加,由于v1v2 的类型不匹配而失败。

如果您改为声明var v2:Double = 2,问题将得到解决。

【讨论】:

  • 好的,但为什么我必须这样做,为什么变量应该相同,而不是数字文字
  • @RahulGUsai 因为变量在声明时具有一种特定类型,而数字文字类型取决于上下文。如果您在第二个示例中使用var v3 = v1 + 2,Swift 会根据使用它的表达式的上下文悄悄地将2 解释为Double
  • 就像你上面所说的,如果你在第二个例子中使用 var v3 = v1 + 2 ,Swift 会根据使用它的表达式的上下文悄悄地将 2 解释为 Double 。但是当我写这篇文章时,为什么 swift 无法推断类型 var v1 = "456" var v2 = 123 + v1
  • @RahulGUsai 这是因为String 不是数字文字123 的可能类型。
猜你喜欢
  • 2010-10-06
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
相关资源
最近更新 更多