Swift泛型函数类型排序

Swift泛型函数类型排序,swift,function,generics,parameters,Swift,Function,Generics,Parameters,假设我有: protocol A { ... } 我想创建一个函数foo(of:),用于区分不同类型的操作。比如: func foo<AHolder: A>(of: AHolder) { ... } func foo<BHolder: B>(of: BHolder) { ... } func foo(of: C) { ... } func-foo(of:AHolder){…} func foo(of:BHolder){…} func-foo(of:C){…

假设我有:

protocol A {
    ...
}
我想创建一个函数
foo(of:)
,用于区分不同类型的操作。比如:

func foo<AHolder: A>(of: AHolder) { ... }

func foo<BHolder: B>(of: BHolder) { ... }

func foo(of: C) { ... }
func-foo(of:AHolder){…}
func foo(of:BHolder){…}
func-foo(of:C){…}
但是,
foo(of:)
的所有调用都将进入
foo(of:AHolder)
的情况,而不是它们相应的类型,即使
type(of:)
函数为参数返回一个
C

我曾尝试使用语句中的
来分离类型,但
中的
在其关联类型未知时不会编译协议(这是上面显示的
B
案例)


是否有任何想法或建议?

< p>您需要在调用站点< /强>中提供类型信息<强>,考虑这两个结构:

struct AHolder: A {
    
}
struct BHolder: B {
    
}
假设您的
foo
方法只打印:

func foo<AHolder: A>(of: AHolder) {
    print("AHolder")
}

func foo<BHolder: B>(of: BHolder) {
    print("BHolder")
}

func foo(of: C) {
    print("C")
}
为什么??因为在调用站点编译器知道您要打印
C
的实例、
AHolder
的实例和
BHolder
的实例

现在试试这个:

let a: some A = BHolder()
foo(of: a) // prints "AHolder"
let b: some B = C()
foo(of: b) // prints "BHolder"


在调用站点,编译器只知道
a
是符合
a
的某种类型的对象,而b是符合
b
的某种类型的对象,因此即使变量实际上是
BHolder
C
的实例,编译器不知道这一点,并使用与它所知道的类型相匹配的重载,即
foo(of:)
foo(of:)

如何准确地传递类型?请注意,泛型是静态类型的,而不是动态类型的,因此要调用的方法是在编译期间决定的,它取决于给定变量的声明方式。
func foo<AHolder: A>(of: AHolder) {
    print("AHolder")
}

func foo<BHolder: B>(of: BHolder) {
    print("BHolder")
}

func foo(of: C) {
    print("C")
}
foo(of: C()) // prints "C"
foo(of: AHolder()) // prints "AHolder"
foo(of: BHolder()) // prints "BHolder"
let a: some A = BHolder()
foo(of: a) // prints "AHolder"
let b: some B = C()
foo(of: b) // prints "BHolder"