首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇异Swift型铸造

奇异Swift型铸造
EN

Stack Overflow用户
提问于 2015-03-02 15:32:42
回答 1查看 748关注 0票数 12

我刚注意到斯威夫特在Int和Double上做了一些类型的铸造。当我试着评估

代码语言:javascript
复制
(10 / 3.0) - (10 / 3)

0.333...是意料之中的,但实际上是0.0。能给我解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-02 15:43:20

是的,我也觉得这很令人惊讶。Double符合FloatLiteralConvertibleIntegerLiteralConvertible ( Swift 3中的ExpressibleByFloatLiteralExpressibleByIntegerLiteral )。因此,可以使用浮点文字初始化Double

代码语言:javascript
复制
let a = 3.0

或使用整数字面值。

代码语言:javascript
复制
let b : Double = 10

(其他浮点类型(如FloatCGFloat)也是如此。)

现在,对于我们所有人来说,这可能都是出乎意料的,因为我们都有一个(目标-)C背景,而这两个语句都是

代码语言:javascript
复制
let x : Double = 10/4     // x = 2.5 .  Really? Yes!
let y = 10/4 as Double    // Same here ...

将值0.25赋值给变量。从上下文来看,除法的结果必须是Double,Swift不隐式转换类型。因此,/必须是浮点除法操作符。

代码语言:javascript
复制
func /(lhs: Double, rhs: Double) -> Double

因此,编译器从文字"10“和"4”创建两个参数为Doubles。(如果10/4被视为两个整数的除数,那么结果也将是一个整数,不能分配给一个Double)。

请注意,这与

代码语言:javascript
复制
let z = Double(10/4)   // z = 2.0 . (I just thought that I understood it &%$!?)

它执行整数除法并将结果转换为DoubleDouble有一个init(_ v: Int)构造函数,因此在这里10/4可以被看作是两个整数的除法。

如果我们总结这些结果,看起来确实有点奇怪:

代码语言:javascript
复制
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

现在我们可以将这些结果应用到您的表达式中。

代码语言:javascript
复制
(10 / 3.0) - (10 / 3)

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

代码语言:javascript
复制
func -(lhs: Double, rhs: Double) -> Double

因此,(10 / 3)也必须是Double。同样,/必须是浮点除法操作符,因此103被视为Double常量。

因此,表达式等价于

代码语言:javascript
复制
(Double(10) / 3.0) - (Double(10) / Double(3))

并评价为0.0。如果将表达式更改为

代码语言:javascript
复制
(10 / 3.0) - Double(10 / 3)

结果是0.333...,因为在这个上下文中,10 / 3是两个整数常量的除法,如前所述。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28813516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档