Чтобы обеспечить некоторый контекст:
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)