8
A
回答
12
是的,我也发现这很令人惊讶。 Double
符合FloatLiteralConvertible
和IntegerLiteralConvertible
(Swift 3中的ExpressibleByFloatLiteral
和ExpressibleByIntegerLiteral
)。因此一个 Double
可以与浮点文字进行初始化
let a = 3.0
或与整数字面:
let b : Double = 10
(这同样适用于其他浮点类型,如Float
和 CGFloat
真)
现在它可能是意想不到的对我们所有人来说有(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 &%$!?)
不同,其进行整数除法并将结果转换为Double
。 Double
有一个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
。再次,/
必须是浮点除法运算符,因此10
和3
被视为Double
常量。
因此,表达式等价于
(Double(10)/3.0) - (Double(10)/Double(3))
和的计算结果为0.0
。如果改变了表达
(10/3.0) - Double(10/3)
那么结果是0.333...
因为在这种情况下,10/3
是两个整常数的划分,如以上所解释。
相关问题
- 1. 奇怪斯威夫特4型系统
- 2. 斯威夫特3铸造问题 - AudioQueue
- 3. 斯威夫特铸造关闭?
- 4. 奇怪向下铸造数组元素未能在斯威夫特3
- 5. 奇怪的边境 - 斯威夫特
- 6. 斯威夫特奇怪的后退按钮文字加
- 7. 奇怪的JavaScript类型铸造
- 8. 类型铸造的奇怪行为
- 9. 斯威夫特 - 铸造的Int64到AnyObject为NSMutableArray的
- 10. 斯威夫特转换斯威夫特
- 11. 斯威夫特2斯威夫特3
- 12. 斯威夫特 - JSQMessagesViewController与斯威夫特
- 13. 斯威夫特铸造错误的,不应该有
- 14. 对象铸造/的ObjectiveC从斯威夫特
- 15. 斯威夫特FUNC参数怪异
- 16. 斯威夫特:未声明的类型
- 17. 奇怪结果与类型铸造
- 18. NSUndoManager斯威夫特代码铸造NSUndoManagerProxy崩溃
- 19. 铸造火力地堡快照斯威夫特3对象
- 20. 铸造在斯威夫特工作不正常
- 21. INT到UInt(反之亦然)位在斯威夫特铸造
- 22. 夫特2型铸造字典
- 23. 斯威夫特:在泛型类
- 24. 斯威夫特通用引用类型
- 25. 斯威夫特:引用泛型类
- 26. 斯威夫特可选类型语法
- 27. 斯威夫特宏观等同类型
- 28. 斯威夫特
- 29. 斯威夫特
- 30. 斯威夫特
很好的解释! – 2015-03-02 16:00:47