【问题标题】:Type 'Self' does not conform to protocol 'Hashable'类型“Self”不符合协议“Hashable”
【发布时间】:2018-01-23 21:07:12
【问题描述】:

当使用扩展为所有符合要求的枚举实现类型方法时,我遇到了“类型'Self'不符合协议'Hashable'”的错误消息,如下所示:

protocol A { 
    static func doSth(with dict[Self: Any])
}

extension A where Self: RawRepresentable, Self.RawValue == Int {
    static func doSth(with dict[Self: Any]) { 
       for (key, value) in dict { //...do something
       }
}

enum First: Int, A {
   case f1, f2, f3
}

enum Second: Int, A {
    case s1, s2, s3
}

....

另一方面,当我通过将我的方法参数的数组键类型编码为 Enum 来实现该方法而不在每个枚举中使用协议和扩展时:

static func doSth(with dict[First: Any]) 
static func doSth(with dict[Second: Any])

等等...我没有错误,可以正确使用doSth的方法。然而,我有几十个这样的枚举,当然更喜欢在扩展中实现这个方法。

附:实现的目的是调用doSth方法,字典参数有一个来自枚举案例的键,例如:

First.doSth(with: [.f1: "good", .f2:"better"]

欢迎提出任何建议。

【问题讨论】:

    标签: swift enums protocols


    【解决方案1】:

    使您的协议符合Hashable(这正是错误消息所说的):

    protocol A: Hashable { ...} 
    

    您的问题是[Self: Any] 无效,除非Self: Hashable,因此您的doSth 方法无法定义。

    【讨论】:

    • 非常感谢,罗布;它有效,你拯救了我的一天。因此,Xcode 编译器开始在协议块进行类型检查,而不是在检查 Self 类型时考虑符合类型。无论如何,这是一个有价值的教训,在解决错误时,我的想法一直停留在符合类型的领域。
    猜你喜欢
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2023-03-24
    相关资源
    最近更新 更多