簡體   English   中英

Swift 通用 Function 類型 訂購

[英]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的實例和AHolderBHolder

現在試試這個:

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 ,所以即使變量確實是BHolderC的實例,8370CAD1D412F78 編譯器也不會知道這一點並使用與它知道的類型匹配的重載,即。 foo<AHolder: A>(of:)foo<BHolder: B>(of:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM