2015-11-06 112 views
0

我試圖將extension限制爲而僅限於caseenum將協議擴展限制爲單枚舉枚舉

例如,這編譯:

extension FooProtocol where T == SomeEnum {} 

但這並不:

extension FooProtocol where T == SomeEnum.CaseOne {} 

我明白,這是不可能的,因爲在caseenum本身不能被表示爲一個type

有沒有解決這個問題的方法?

編輯:

我的情況是類似以下內容:

extension SignalProducerType where E == AppError.NonError { 
    func ignoreError() -> SignalProducer<T, NoError> {} 
} 

我想揭露ignoreError方法僅適用於那些有一個ErrorTypeAppError.NonError(這是自定義的類型)

+0

你的第一個例子不能編譯。也許你的意思就像你之前的問題中的'extension FooProtocol where T == SomeEnum {}'那樣? - 我必須承認,我不清楚你想達到什麼目的(也許是因爲我不認識斯卡拉:)。 'SomeEnum.CaseOne'是'SomeEnum'類型的一個可能的*值,而不是一個類型。 –

+0

@MartinR有一個錯字。我編輯了這個問題,讓我的意圖更清晰一點! –

回答

1

這取決於你正在努力達到的目標,但總之並不是真的。類型檢查器(和協議一致性檢查)在編譯時發生,枚舉的情況一般只在運行時才知道。

您可以在協議擴展中定義該方法以對整個枚舉進行操作,但對於其他情況返回nil(或不執行任何操作)。

+0

我編輯了這個問題,使意圖更清晰。你能想到這種模式的另一種選擇嗎? –

+0

我仍然非常肯定你不能那樣做。主要是因爲你是類型系統,編譯時間一般是編譯器不知道枚舉的情況。相反,定義ignoreError來檢查大小寫,並在必要時返回nil。 –