Swift 带扩展的自动类型转换:这里发生了什么?
我正在阅读《Swift编程语言》(Swift Programming Language)一书的第一章,在这一章中,我描述了Swift 带扩展的自动类型转换:这里发生了什么?,swift,Swift,我正在阅读《Swift编程语言》(Swift Programming Language)一书的第一章,在这一章中,我描述了扩展关键字 我尝试了一下“实验”: “为添加absoluteValue属性的Double类型编写扩展名。” 我让它像这样工作: extension Double { var absoluteValue: Double { if(self < 0) { return self * -1 }
扩展
关键字
我尝试了一下“实验”:
“为添加absoluteValue属性的Double类型编写扩展名。”
我让它像这样工作:
extension Double {
var absoluteValue: Double {
if(self < 0) {
return self * -1
}
return self
}
}
(-10.5).absoluteValue // 10.5
这里发生了什么?编译器是否将类型从Int
更改为Double
,因为它看到Double
上有一个absoluteValue
扩展名,而不是Int
这似乎是因为如果我在Int
上添加另一个同名的扩展名
,如下所示:
extension Int {
var absoluteValue: Int {
return 42
}
}
这将覆盖Double
上的扩展名。和(-4)。绝对值返回42
有没有办法添加一个扩展名
,该扩展名只能在Double
s上工作,而不能在Int
s上工作
编辑:看起来它在编译时进行转换,因为我没有为我的文本定义类型,所以它转换了它。以下操作将产生一个错误
var i:Int = -4;
i.absoluteValue
游乐场执行失败:错误::12:1:错误:“Int”没有名为“absoluteValue”的成员
i、 绝对值
^~~~~~~~~~~~~~~”
编辑2:它似乎只适用于文字;以下操作也会产生错误:
var i = -4;
i.absoluteValue
是的,您编写的扩展实际上只适用于Double
s,而不适用于Int
s。看看这个例子:
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
双分机{
var绝对值:双精度{
if(self<0){
返回自我*-1
}
回归自我
}
}
双变量:Int=10
double.absoluteValue//Int没有名为absoluteValue的成员
但是,在您的代码中,编译器隐式地将您的Int
转换为Double
,以防任何人想要符合示例协议的答案:
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
extension Double: ExampleProtocol {
var simpleDescription: String {
return "The number \(self)"
}
var absoluteValue: Double {
return fabs(self)
}
mutating func adjust() {
self = round(self)
}
}
var double: Double = -12.34
double.simpleDescription
double.absoluteValue
好奇的是,这是苹果刚刚宣布的swift吗?@AD.Net-是的,我想今天下午试一试,然后开始玩它;这里似乎也适用同样的情况:组合数值常量和变量的规则与数值文字的规则不同。文字值3可以直接添加到文字值0.14159,因为数字文字本身没有显式类型。只有在编译器对其进行计算时,才会推断其类型摘自:苹果公司的《Swift编程语言》。iBooks。这比创建一个变量Int(-2).绝对值
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
extension Double: ExampleProtocol {
var simpleDescription: String {
return "The number \(self)"
}
var absoluteValue: Double {
return fabs(self)
}
mutating func adjust() {
self = round(self)
}
}
var double: Double = -12.34
double.simpleDescription
double.absoluteValue