在使用Swift编程语言指南:扩展中的示例代码后,我将结构体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 3.0.1 编程语言指南: 基础知识: 类型安全和类型推断中的说法相矛盾呢?
类型推断允许编译器自动推导出编译代码时特定表达式的类型,只需检查您提供的值即可。
编辑
从回复中我了解到这是因为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