import Foundation改变算术运算符的行为

时间:2014-08-08 18:39:14

标签: swift

Welcome to Swift!  Type :help for assistance.
   1> 1 / 3.0
$R0: Double = 0.33333333333333331
   2> 1 % 3
$R1: Int = 1
   3> 1 % 3 / 3.0
$R2: Double = 0.33333333333333331

   4> import Foundation
   5> 1 / 3.0
$R3: Double = 0.33333333333333331
   6> 1 % 3
$R4: Int = 1
   7> 1 % 3 / 3.0
$R5: Int = 0    // this result changes after importing Foundation

这是Swift中的错误还是某种隐式转换魔法?

修改

重现此问题的另一种(更简单)方法:

  1> 1.0 / 3
$R0: Double = 0.33333333333333331
  2> import Foundation
  3> 1.0 / 3
$R1: Int = 0
  4> Double(1.0) / 3    // this is a workaround
$R2: Double = 0.33333333333333331

我可以在iOS应用中重现此问题,而不仅仅是来自REPL。我使用的是xcode6-beta5。

3 个答案:

答案 0 :(得分:1)

如果没有Foundation,这两个表达式会返回不同的类型:

1 % 3 / 3     // 0 : Int
1 % 3 / 3.0   // 0.33333333333 : Double

这与Swift书中定义的行为一致:

  

“如果在表达式中组合整数和浮点文字,将从上下文中推断出一种Double:”

使用Foundation,表达式都返回一个Integer:

1 % 3 / 3     // 0 : Int
1 % 3 / 3.0   // 0 : Int

经过调查,我无法在基金会看到任何明显的事情,导致这一点 - 没有为%或/定义的奇怪运算符,并且优先级看起来是一样的。不仅如此,我还不能在游乐场或REPL之外重现这种行为。如果您在一个简单的控制台应用程序中执行上述操作,即使您导入Foundation,也会看到预期的(0.333333333333333:Double)结果。

正如扎普所说,这几乎肯定是一个错误。我报告了。

答案 1 :(得分:0)

我在操场上玩,试图复制你的问题但是没有用。我试过这个......

let r7 = 1 % 3 / 3.0 //evaluates to 0.333333

import Foundation

let r8 = 1 % 3 / 3.0 //evaluates to 0.333333

我认为你所看到的可能是将LHS分配给LHS上的显式类型Double vs type Int变量。所以...

let r5:Double = 1 % 3 / 3.0 //evaluates to 0.33333
let r6:Int = 1 % 3 / 3.0 //evaluates to 0

我发现这个数学表达式对于不同的读者也有些模棱两可。将它重写为(1%3)/3.0 可能是明智的(如果这实际上是你的意思!!那就是计算机看到的)。当然,1%3的结果是整数1.整数1除以Double 3.0等于0.33333。所以我觉得你的问题可以减少到......

let r5:Double = 0.3333333 //evaluates to 0.33333
let r6:Int = 0.3333333 //evaluates to 0

这与算术无关,只是Int和Double类型的差异。希望它有所帮助。

答案 2 :(得分:0)

答案是Swift破了,毕竟是Beta。我向Apple提交了一份错误报告,雷达:17962491。