2016-03-16 128 views
1

我正在試驗協議以及如何使用它們來解耦代碼,同時利用協議的其他副作用。基本上,我想要做的是以下幾點:符合協議的變量子集的Swift通用類型

一個例子可能是API調用的超集,它按範圍分組成協議(例如「用戶API調用」和「設置API調用」,或「突變API調用「和」突變API調用「)。在這種情況下,有興趣使用由A公開的API的消費者不一定知道BC的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>要求返回的對象符合ABC,而不僅僅是它們的一個子集。
  • 鑑於此錯誤,似乎甚至不可能「將協議用作符合協議的具體類型」。

總之,它甚至有可能實現什麼,我想?

回答

0

我就把你使用泛型在你的情況,我很可能也看協議繼承。

因此,例如,一個可變協議將從不變協議繼承,因爲你要能夠訪問作爲替代的情況下,最小和接入和變化。

協議的目的是將您從底層的實現類中抽象出來。在你的例子中,泛型並沒有真正增加這種能力。您的工廠(或工廠)可以簡單地提供許多創建方法,以返回符合各種協議的對象。

要繼續使用泛型意味着暴露下面的實現類,這是您的錯誤的原因。你不能使用協議,因爲它不具體,它只是一些具體對象將提供的定義。

+0

我同意與可變/不可變的例子,協議繼承是優選的,但與其他實施例,不認爲它是。根據我的經驗,將相關行爲按照描述分組爲協議是一種常見的方法。但是,對於協議(a,b,c,ab,ac,bc,abc)的每個單一組合都具有創建功能可能不是所期望的。無論如何,它是否正確地被理解爲我不能只使用泛型協議(''),但是我需要一個類型,然後我可以要求它符合給定的協議(' )? –

+0

我明白了,謝謝澄清。你認爲這是Swift的限制嗎?如果是這樣,這個限制的原因是什麼? 「我能否擁有符合本協議的某個對象」這個問題在我看來是不無道理的。 –

相關問題