2015-11-06 80 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。 –