枚举结构创建
问题描述:
我工作的一个模型定义与斯威夫特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 {}
)
有没有解决方案让我的两个枚举符合一个自定义类型?
答
这可以给你一个灵活的方式来表达你枚举符合自定义域协议,仍然可以用作字典和数组元素。 但同样,这避免对不同枚举类型作为字典键混合:
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"))
* ......没有成功*不要告诉太多关于真正的问题,什么是你的关注? – xhamr
@xhamr我想知道如何实现这种结构,但我不知道使用协议是否正确。如果是这样,我有一个协议的哈希编译错误。我试图使它符合Hashable,但得到其他错误。 – Pierre
问题在于'Hashable'所符合的'Equatable'协议具有'-Self'关联,并且不能用作类型声明符。您可以采用一种将泛型映射创建封装在泛型函数中的解决方法,但仍然可以避免在同一个映射中混合使用不同的枚举类型。 – xhamr