Swift中无需新增类型实现Box<Void>的Equatable兼容方案探讨
解决Box无法获得Equatable一致性的替代方案
嘿,这个问题我之前也碰到过,其实不用额外定义新的Empty类型也能搞定,给你两个实用的方案:
方案1:给Void扩展Equatable协议
既然问题根源是Void没遵循Equatable,那直接给它补上这个协议一致性就好了。因为Void本质就是空元组(),只有唯一的实例,所以==操作符逻辑非常简单:
extension Void: Equatable { public static func == (lhs: Void, rhs: Void) -> Bool { // Void只有一个可能的值,必然相等 return true } }
这样你的原代码extension Box: Equatable where T: Equatable { }就能自动适配Box<Void>了,完全不需要修改Box的现有逻辑,一劳永逸。
方案2:给Box<Void>单独实现Equatable
如果你不想全局修改Void的协议一致性(担心影响其他代码),可以专门针对Box<Void>做特化扩展:
extension Box where T == Void { static func == (lhs: Box<Void>, rhs: Box<Void>) -> Bool { // 存储的Void没有任何内容,两个Box<Void>天然相等 return true } }
这个方案更聚焦,只让Box<Void>具备Equatable特性,不会对全局的Void类型造成影响。
这两个方案都能满足你的需求,具体选哪个取决于你是否愿意全局扩展Void的协议支持~
内容的提问来源于stack exchange,提问作者pshah
相关产品推荐
相关产品推荐

