Swift不自定义==函数,如何排除结构体部分属性参与Equatable判等?
Swift 结构体Equatable排除指定属性的低出错实现方案
方案1:Swift 5.9+ 官方@EquatableIgnored宏(无手动==实现,推荐)
这是目前最低成本的实现方式,仅需给不需要参与相等比较的属性添加@EquatableIgnored注解,编译器自动生成的Equatable判等逻辑会自动跳过该属性,完全不需要手写==函数。新增属性时默认会自动加入判等逻辑,不会出现漏写的问题。
注:
@EquatableIgnored由SwiftUI框架提供,如果你开发的是不依赖SwiftUI的项目,可以使用下方的元组比较方案。
代码示例:
import SwiftUI struct House: Equatable { var field_0: String var field_1: String // ... 其他需要参与判等的属性 @EquatableIgnored var field_49: String // 该属性不会参与相等比较 var field_50: String }
方案2:全版本兼容方案:元组批量比较
如果使用的是Swift 5.9以下的版本,或者项目不依赖SwiftUI,可以将所有需要参与判等的属性打包为元组,利用Swift元组自动支持Equatable比较的特性完成判等,不需要手写大量if判断,仅需维护一次需要参与判等的属性列表即可,出错概率远低于逐个属性判断。
代码示例:
struct House: Equatable { var field_0: String var field_1: String // ... 其他属性 var field_49: String var field_50: String static func == (lhs: House, rhs: House) -> Bool { return ( lhs.field_0, lhs.field_1, // ... 其他需要参与判等的属性 lhs.field_48, lhs.field_50 // 不需要参与判等的field_49不加入元组即可 ) == ( rhs.field_0, rhs.field_1, // ... 对应右侧属性 rhs.field_48, rhs.field_50 ) } }
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

