如何在 swift 中自己编写 Hashable 协议

How to write Hashable protocol yourself in swift

有没有办法使自定义协议像标准 HashableEquatableCodable 等一样传播,即当 struct/[ 的所有属性=18=] 符合协议然后 struct/class 本身可以符合该协议。

假设我有一个像这样的简单协议:

protocol State {
    init()
}

假设我有两个结构:

struct State1: State {}
struct State2: State {}

它们符合协议,那么我想要另一个 struct 符合我的协议,如下所示:

struct AppState: State {  // error: Type 'AppState' does not conform to protocol 'State'
    let state1: State1
    let state2: State2
}

理论上,如果所有属性都有一个空 init(),那么在 AppState 结构中隐式实现 init 应该没有问题。但是编译器只理解 AppState 中的显式 init()。那么有没有办法增强我的协议 State 以具有该功能?

不幸的是,不,目前这在 Swift 中是不可能的。自动遵守协议目前仅限于直接在编译器中实现(参见 implementation for Codable, and Equatable and Hashable);能够接入此机制的唯一方法是向编译器添加直接支持——如果您愿意分叉编译器并使用它来编译所有代码,这是可行的,但这是一个相当大的飞跃。