枚举结构创建

问题描述:

我工作的一个模型定义与斯威夫特3. 我有两个简单枚举:枚举结构创建

enum CompanyField: String { 
    case id 
    case name 
} 

enum UserField: String { 
    case email 
    case id 
    case id_company 
} 

当使用集我就喜欢以符合泛型类型。喜欢的东西Field e.g:

let fields: [Field : String] = [UserField.id : "1", CompanyField.name : "A name"] 

let fields: [Field] = [UserField.id, CompanyField.name] 

我试图创建一个域的协议,但没有成功。 (例如:enum UserField: Field {}

有没有解决方案让我的两个枚举符合一个自定义类型?

+0

* ......没有成功*不要告诉太多关于真正的问题,什么是你的关注? – xhamr

+0

@xhamr我想知道如何实现这种结构,但我不知道使用协议是否正确。如果是这样,我有一个协议的哈希编译错误。我试图使它符合Hashable,但得到其他错误。 – Pierre

+0

问题在于'Hashable'所符合的'Equatable'协议具有'-Self'关联,并且不能用作类型声明符。您可以采用一种将泛型映射创建封装在泛型函数中的解决方法,但仍然可以避免在同一个映射中混合使用不同的枚举类型。 – xhamr

这可以给你一个灵活的方式来表达你枚举符合自定义域协议,仍然可以用作字典和数组元素。 但同样,这避免对不同枚举类型作为字典键混合:

func map<K,V>(forFields fields: (K,V)...) -> [K:V] where K : Hashable{ 
    var dict = [K:V]() 
    fields.forEach { (key, value) in 
     dict[key as K] = value 
    } 
    return dict 
} 
map(forFields: (UserField.email, "email"), (UserField.id,"id"))