【发布时间】:2016-12-07 08:24:29
【问题描述】:
使用来自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 中的说法是否矛盾?
类型推断使编译器能够推断出特定的类型 编译代码时自动表达,只需通过 检查您提供的值。
编辑
从回复中我了解到这是因为 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
【问题讨论】:
-
这是编辑中的一个好问题。
标签: swift types casting swift3 implicit