[英]Swift Generic Function Types Ordering
假設我有:
protocol A {
...
}
protocol B: A {
... // some associated types
}
struct C: B {
...
}
我想制作一個 function foo(of:)
來區分不同類型的操作。 喜歡:
func foo<AHolder: A>(of: AHolder) { ... }
func foo<BHolder: B>(of: BHolder) { ... }
func foo(of: C) { ... }
但是,所有對foo(of:)
的調用都將進入foo<AHolder: A>(of: AHolder)
的情況,而不是它們對應的類型,即使type(of:)
function 為參數返回C
也是如此。
我嘗試使用in
語句來分隔類型,但是當它們的關聯類型仍然未知時(即上面顯示的B
案例), in
不會為協議編譯。
有什么想法或建議嗎?
您需要在調用站點提供類型信息,請考慮以下兩個結構:
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")
}
這工作正常:
foo(of: C()) // prints "C"
foo(of: AHolder()) // prints "AHolder"
foo(of: BHolder()) // prints "BHolder"
為什么? 因為在調用站點,編譯器知道您要打印 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
的某種類型的 object ,而 b 是符合B
的某種類型的 object ,所以即使變量確實是BHolder
和C
的實例,8370CAD1D412F78 編譯器也不會知道這一點並使用與它知道的類型匹配的重載,即。 foo<AHolder: A>(of:)
和foo<BHolder: B>(of:)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.