2015-03-02 49 views

回答

12

是的,我也发现这很令人惊讶。 Double符合FloatLiteralConvertibleIntegerLiteralConvertible(Swift 3中的ExpressibleByFloatLiteralExpressibleByIntegerLiteral)。因此一个 Double可以与浮点文字进行初始化

let a = 3.0 

或与整数字面

let b : Double = 10 

(这同样适用于其他浮点类型,如FloatCGFloat真)

现在它可能是意想不到的对我们所有人来说有(Objective-)C背景 这两条语句

let x : Double = 10/4  // x = 2.5 . Really? Yes! 
let y = 10/4 as Double // Same here ... 

分配值0.25的变量。从上下文来看, 分区的结果必须是Double,并且Swift不会隐式转换类型。 因此/必须是浮点除法运算符

func /(lhs: Double, rhs: Double) -> Double 

所以编译器创建从文字 “10”和“4”的两个参数为Double秒。 (如果10/4分别为两个整数 的分割处理,然后其结果也将是一个整数,并且不能被分配 到Double。)

注意,这是从

let z = Double(10/4) // z = 2.0 . (I just thought that I understood it &%$!?) 

不同,其进行整数除法并将结果转换为DoubleDouble有一个init(_ v: Int)构造函数,因此10/4 可以在这里被视为两个整数的划分。

它真的看起来有点怪怪的,如果我们把这些结果总结:

let x : Double = 10/4  // x = 2.5 
let y = 10/4 as Double // y = 2.5 
let z = Double(10/4)  // z = 2.0 

现在,我们可以将这些结果与你的表达

(10/3.0) - (10/3) 

第一部分(10/3.0)只能是Double,因此- 必须是浮点减法运算符

func -(lhs: Double, rhs: Double) -> Double 

因此(10/3)也必须是Double。再次,/必须是浮点除法运算符,因此103被视为Double常量。

因此,表达式等价于

(Double(10)/3.0) - (Double(10)/Double(3)) 

和的计算结果为0.0。如果改变了表达

(10/3.0) - Double(10/3) 

那么结果是0.333...因为在这种情况下,10/3 是两个整常数的划分,如以上所解释。

+2

很好的解释! – 2015-03-02 16:00:47