Swift 4.1 - SE-0185 Synthesizing
2020-12-11 本文已影响0人
ienos
遵循 Equatable 和 Hashable,减少 == 和 hashValue 重复代码编写
在该特性之前,Equatable 需要手动实现 == 运算符,然后对所有成员进行等价判断。而且当我们每添加增加、删除或修改一个属性时,就需要手动更新该方法,不易维护而且容易出错
struct Person: Equatable {
static func == (lhs: Person, rhs: Person) -> Bool {
return lhs.firstName == rhs.firstName &&
lhs.lastName == rhs.lastName &&
lhs.birthDate == rhs.birthDate &&
...
}
}
此特性中,类型可以通过遵循 Equatable 或 Hashable 但是不实现任何代码,编译器将自动为该类型生成 ==/hashValue 的实现
自动生成协议方法的条件
1. Enum
- 没有 case 不会生成
- 有一个或多个 case, 所有 case 的关联值都得符合 Equatable 和 Hashable 协议
2. Struct
- 对于没有存储属性的 Struct 都可视为等价且哈希值相等
- 当且仅当所有存储属性遵循 Equatable 和 Hashable 协议,编译器才会自动生成方法
如果需要忽略某个属性的相等性判断,需要将重写 == 和 hashValue 方法
目前暂时不对 tuples 和 class 类型支持