swift – 带扩展名的自动类型转换:这里发生了什么?
我将阅读The
Swift Programming Language一书的第一章,我正处于描述扩展关键字的部分.
我去了“实验”:
我得到它像这样工作: extension Double { var absoluteValue: Double { if(self < 0) { return self * -1 } return self } } (-10.5).absoluteValue // 10.5 但它似乎也适用于整数: (-4).absoluteValue // 4.0 这里发生了什么?编译器是否将类型从Int更改为Double,因为它看到Double上有一个absoluteValue扩展而不是Int? 这似乎是这种情况,因为如果我在Int上添加同名的另一个扩展名,如下所示: extension Int { var absoluteValue: Int { return 42 } } 这会覆盖Double上的扩展名.并且(-4).absoluteValue返回42 有没有办法添加一个仅适用于双打但不适用于Ints的扩展程序? 编辑:看起来它正在编译时进行转换,因为我没有为我的文字定义一个类型,所以它转换了它.以下产生错误 var i:Int = -4; i.absoluteValue
编辑2:它似乎只适用于文字;以下也会产生错误: var i = -4; i.absoluteValue 解决方法
是的,你写的扩展实际上只适用于双打,而不适用于Ints.看看这个例子:
extension Double { var absoluteValue: Double { if (self < 0) { return self * -1 } return self } } var double: Int = 10 double.absoluteValue // Int does not have a member named absoluteValue 但是,在您的代码中,编译器会隐式地将Int转换为Double. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |