提供一些背景信息:
P代表财产。该代码的目的是,不同类型的值应由单独的方法(例如serializeInt,serializeDouble等)处理,类似于方法重载,但参数的类型来自类型参数。
以下代码实际上可以正常工作。它调用专门的pr(_:Int)实现,并显示“ int”。
但是,如果我将声明“ func pr(_ t:Int)”更改为注释的一个“ func pr(_ t:T)”,则将调用通用版本。
任何人都有任何指向指定此行为的地方或为什么这样工作的指针?
protocol P {
associatedtype T
// this will be 'specialized' for concrete types
func pr(_ t: T)
// the operation that should call different pr implementations depending on T
func op(_ t: T)
}
extension P {
func op(_ t: T) {
pr(t)
}
}
// fallback implementation
extension P {
func pr(_ t: T) {
print("generic")
}
}
// pr 'specialized' on Int
extension P where T == Int {
// func pr(_ t: T) {
func pr(_ t: Int) {
print("int")
}
}
struct Prop<T>: P {
}
// create an Int prop and do the op
let p = Prop<Int>()
p.op(1)
答案 0 :(得分:0)
没有看到任何奇怪的行为。如果您取消注释此行– func pr(_ t: T) {
此处p.op(1)
将调用默认方法,因为您尚未提供op
方法where T == Int
的实现。而默认的op
会调用默认的pr
,这就是它显示“通用”的原因。