Swift 带扩展的自动类型转换:这里发生了什么?

Swift 带扩展的自动类型转换:这里发生了什么?,swift,Swift,我正在阅读《Swift编程语言》(Swift Programming Language)一书的第一章,在这一章中,我描述了扩展关键字 我尝试了一下“实验”: “为添加absoluteValue属性的Double类型编写扩展名。” 我让它像这样工作: extension Double { var absoluteValue: Double { if(self < 0) { return self * -1 }

我正在阅读《Swift编程语言》(Swift Programming Language)一书的第一章,在这一章中,我描述了
扩展
关键字

我尝试了一下“实验”:

“为添加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