如何在 swift 中自己编写 Hashable 协议
How to write Hashable protocol yourself in swift
有没有办法使自定义协议像标准 Hashable
、Equatable
、Codable
等一样传播,即当 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
);能够接入此机制的唯一方法是向编译器添加直接支持——如果您愿意分叉编译器并使用它来编译所有代码,这是可行的,但这是一个相当大的飞跃。
有没有办法使自定义协议像标准 Hashable
、Equatable
、Codable
等一样传播,即当 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
);能够接入此机制的唯一方法是向编译器添加直接支持——如果您愿意分叉编译器并使用它来编译所有代码,这是可行的,但这是一个相当大的飞跃。