2016-03-02 110 views
1

'emun'在我看来就像一个关键字或基本类型。 很显然下面的代码无法编译:如何检查一个实例是否为枚举类型

if self is enum { 

} 

但我怎么能能够检查如果某些协议由任何enum实施?

protocol Enumatable { 

} 

extension Enumatable { 
    func isEnum() -> Bool { 
     return self is enum //it does not compile 
    } 
} 

但我真正想要的是在协议中设置某种约束来强制采用类为枚举。那可能吗?

谢谢!

+3

我不认为这是可能的。但真正的问题是为什么? –

+0

那么,因为使用枚举的case结构,我可以为我的库提供一个简单而安全的api。我不希望用户能够使用类或结构来实现协议,因为我的库使用枚举的值作为内部键,另外我希望这种模式是实现协议的唯一方式。 –

+1

您可能与'ErrorType'类似的情况。错误类型最好用作枚举类型,但这并不意味着我们必须将其限制为枚举类型。你不可能阻止你的用户在脚下自己射击。一个好的文档是最好的,你可以做的。 –

回答

0

我不确定它是如何使用镜像的高性能。但在这里你去:

enum SomeEnum { 
     case one 
     case two 
    } 

    let mirror = Mirror(reflecting: SomeEnum.one) 
    if let displayStyle = mirror.displayStyle { 
     switch displayStyle { 
     case .enum: 
      print("I am an enum") 
     default: 
      print("not an enum") 
     } 
    } 
相关问题