使用
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,所以在此上下文中没有歧义.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。