你能组合一个类型和协议,并将其用作枚举的基本类型吗?

时间:2016-08-24 18:11:31

标签: swift enums protocols

我有一种特殊的使用枚举的模式,它总是String类型,而enum(不是它的原始值)也遵循特定的协议。写得正常,就像这样......

private enum IndicatorA : String, IndicatorProtocol
{
    case X
    case Y
    case Z
}

我想要做的是找出是否有任何我可以做的事情来使字符串隐含所以我需要输入的就是这个......

private enum IndicatorA : Indicator
{
    case X
    case Y
    case Z
}

...其中Indicator指示原始值属于String类型,枚举本身也遵循IndicatorProtocol协议。

我已经尝试过这两种方法来提出用作原始值类型的东西,但都没有编译。另外,从技术上讲,将协议放在字符串而不是枚举上,所以不管怎么说都不是我的意思。 (同样,我想要enum上的协议,而不是原始值。)

class Indicator : String, IndicatorProtocol
{
}

struct Indicator : String, IndicatorProtocol
{
}

那么有什么方法可以做我想要在Swift 2.x或3.x中实现的目标吗?也许是以某种方式限制了协议?

1 个答案:

答案 0 :(得分:1)

对此有几点想法:

假设可以使枚举包含Indicator作为其原始值,重要的是要注意这实际上不会使枚举本身符合IndicatorProtocol,只有它的rawValue才符合。换句话说:

enum IndicatorA : String, IndicatorProtocol

与以下内容不同:

enum IndicatorA : StringThatConformsToIndicatorProtocol

对于第一个示例,您可以访问如下协议:

let example:IndicatorA = IndicatorA(rawValue:"Test")
example.someProtocolMethod()

对于第二个示例,您必须访问如下协议:

let example:IndicatorA = IndicatorA(rawValue:"Test")
example.rawValue.someProtocolMethod()

因为在第一个例子中,枚举本身符合协议,但在第二个例子中,枚举的原始值符合协议。

所有说的,您可以通过创建符合IndicatorStringLiteralConvertible和您自己Equatable的{​​{1}}结构来使第二个示例正常工作{1}}。例如:

IndicatorProtocol

但这是一项额外的工作,以达到一个我认为你不希望的结果!