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

Swift中的隐式类型转换

发布时间:2020-12-14 04:38:06 所属栏目:百科 来源:网络整理
导读:使用 Swift Language Guide: Extensions的示例代码,我已经像这样使用了struct double extension Double { func someFunc() { print("someFunc") }} 我对此声明感到惊讶 2.someFunc() 没有生成编译时错误,如:’Int’类型的值没有成员’someFunc’.我期望将2
使用 Swift Language Guide: Extensions的示例代码,我已经像这样使用了struct double

extension Double {
    func someFunc() {
        print("someFunc")
    }
}

我对此声明感到惊讶

2.someFunc()

没有生成编译时错误,如:’Int’类型的值没有成员’someFunc’.我期望将2的值隐式地转换为Int,但Swift将其转换为Double.这是为什么 ? Swift如何确定在这种情况下2的值是Double类型?

然后我试着像这样调用someFunc()

let x = 2
x.someFunc()

在这里,我得到了预期的编译时错误

这是否与Swift Programming Language 3.0.1 : Language guide : The basics : Type Safety and Type Inference的说法相矛盾?

Type inference enables a compiler to deduce the type of a particular
expression automatically when it compiles your code,simply by
examining the values you provide.

编辑

从响应中我了解到它发生是因为Double符合ExpressibleByIntegerLiteral协议.但是Float结构也确实符合它和其他一些类型.下面我创建了符合该协议的结构.最后,在编译时选择Double.为什么?一个扩展的方法的优先级如何通过其他扩展的方法确定?

struct someStruct: ExpressibleByIntegerLiteral{
    var i:Int = 0

    init(integerLiteral value: Int64){
        i = Int(value)
    }    
}

extension someStruct {
    func someFunc() {print("Somestruct someFunc") }
}

extension Double {
    func someFunc() { print("Double someFunc") }
}

4.someFunc()

//prints: Double someFunc

解决方法

Double是符合协议 ExpressibleByIntegerLiteral的类型之一.由于2是整数leteral,编译器可以检查哪个符合协议的类型具有someFunc(),并且因为只有Double,所以在此上下文中没有歧义.

(编辑:李大同)

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

    推荐文章
      热点阅读