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

标签 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。

最佳答案

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

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

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

“If you combine integer and floating-point literals in an expression, a type of Double will be inferred from the context:”

对于 Foundation,表达式都返回一个整数:

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

经过调查,我在 Foundation 中看不到任何明显的原因会导致这种情况——没有为 % 或/定义的奇怪运算符会执行此操作,并且优先级似乎相同。不仅如此,我还无法重现 Playground 或 REPL 之外的行为。如果您在一个简单的控制台应用程序中执行上述操作,那么即使您导入 Foundation,您也会看到预期的 (0.333333333333333: Double) 结果。

正如 Zaph 所说,这几乎可以肯定是一个错误。我会举报的。

关于swift - import Foundation 改变算术运算符的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25210151/

相关文章:

objective-c - 将 Swift pod 导入 Objective-C 项目时找不到模块错误

swift - 二维数组 swift 填充代码和描述为空

swift - 动态改变 SwiftUI 的 VStack 的顺序

swift - 在字典扩展中使用未声明的类型 'KeyType' (Swift)

objective-c - 删除 Pod 会引发错误 : dyld: Library not loaded:

ios - 从 Swift 中的通用 T.Type 获取对象

swift - 带有核心数据的 SwiftUI 中的 @FetchRequest 注释

swift - 无法通过下标赋值 : 'dict' is a 'let' constant

ios - SceneKit 不会在 Xcode 12 中填满屏幕

ios - 从DispatchQueue Swift内部返回