我正在試驗協議以及如何使用它們來解耦代碼,同時利用協議的其他副作用。基本上,我想要做的是以下幾點:符合協議的變量子集的Swift通用類型
一個例子可能是API調用的超集,它按範圍分組成協議(例如「用戶API調用」和「設置API調用」,或「突變API調用「和」突變API調用「)。在這種情況下,有興趣使用由A
公開的API的消費者不一定知道B
和C
的API。
考慮模仿上面的場景以下協議:
protocol A {}
protocol B {}
protocol C {}
然後,給定一組協議[A, B, C]
,採用了廠級,我想符合的一個子集的API對象的實例這些:
let a = Factory<A>.create()
let ab = Factory<A, B>.create()
let bc = Factory<B, C>.create()
我試圖實現,如一個handfuld:
class Factory<T: protocol<A, B, C>> {
class func create() -> T {
return ...
}
}
然而,隨着let a = Factory<A>.create()
初始化產生以下錯誤:發生
Using 'A' as a concrete type conforming to protocol 'A' is not supported
同樣的錯誤,如果工廠被定義爲:
class Factory<T where T: A, T: B>
有一些明顯失敗的幾件事情:
<T: protocol<A, B, C>>
和<T where T: A, T: B>
要求返回的對象符合A
,B
和C
,而不僅僅是它們的一個子集。- 鑑於此錯誤,似乎甚至不可能「將協議用作符合協議的具體類型」。
總之,它甚至有可能實現什麼,我想?
我同意與可變/不可變的例子,協議繼承是優選的,但與其他實施例,不認爲它是。根據我的經驗,將相關行爲按照描述分組爲協議是一種常見的方法。但是,對於協議(a,b,c,ab,ac,bc,abc)的每個單一組合都具有創建功能可能不是所期望的。無論如何,它是否正確地被理解爲我不能只使用泛型協議(''),但是我需要一個類型,然後我可以要求它符合給定的協議(' )? –
確實,選擇繼承的地方,不要只是讓一切都繼承。您可以使用協議定義泛型,但不能使用協議實例化它,因爲它不具體。 – Wain
我明白了,謝謝澄清。你認爲這是Swift的限制嗎?如果是這樣,這個限制的原因是什麼? 「我能否擁有符合本協議的某個對象」這個問題在我看來是不無道理的。 –