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"