在斯威夫特2子協議父協議相關聯的類型,我有一個協議:指定與斯威夫特
protocol Protocol {
typealias Type
}
當我想用Protocol
沒有定義使用什麼類型Type
:
var protocol1: Protocol
然後我發現了以下錯誤:
Protocol 'Protocol' can only be used as a generic constraint because it has Self or associated type requirements
這是CLEA r爲什麼這不起作用。
我有另一種協議,其從第一協議繼承和指定該相關類型Type
應該是一個String
。發生
protocol AnotherProtocol: Protocol {
typealias Type = String
}
同樣的錯誤,當我嘗試使用此協議:
var protocol2: AnotherProtocol
Protocol 'AnotherProtocol' can only be used as a generic constraint because it has Self or associated type requirements
爲什麼我收到了這樣的錯誤,雖然我已經指定了相關的類型?
第二個協議是否有另一種方式來指定父協議的關聯類型,而不必在每個實現第二個協議的類中再次指定它?
謝謝你的回答。我需要傳遞第二個協議,而不必知道實現該協議的類/結構。但正如你所說,如果協議具有關聯類型,那麼使用協議作爲類型是不可能的。第二個協議有一個關聯的類型,但很明顯,這是什麼類型。我覺得這很奇怪。使用這個協議作爲一個類型應該是可能的,因爲所有關聯的類型都被聲明瞭。 – Marian
您可以使用類型擦除封裝器 – oisdk
不幸的是,實現第二個協議的類需要有一個超類。所以它必須實現協議,並且不能繼承其他類,但是使用類型擦除的包裝器必須使用創建的類。 – Marian