加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:41:45 所属栏目:百科 来源:网络整理
导读:我将阅读The Swift Programming Language一书的第一章,我正处于描述扩展关键字的部分. 我去了“实验”: “Write an extension for the Double type that adds an absoluteValue property.” 我得到它像这样工作: extension Double { var absoluteValue: Do
我将阅读The Swift Programming Language一书的第一章,我正处于描述扩展关键字的部分.

我去了“实验”:

“Write an extension for the Double type that adds an absoluteValue property.”

我得到它像这样工作:

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

“Playground execution failed: error: :12:1: error: ‘Int’ does not have a member named ‘absoluteValue’
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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读