在Swift中,运算符==用于检查两个值是否相等。为了使这个运算符可以用于用户定义的类型,该类型必须遵循Equatable协议并实现静态函数==。
实现应是对称和传递的。示例:
struct Person: Equatable { let name: String let age: Int static func ==(lhs: Person, rhs: Person) -> Bool { return lhs.name == rhs.name && lhs.age == rhs.age } }
需要记住的是,如果您的类型未实现==,则尝试比较两个这样的实例将导致编译错误。
问题: 如果结构或类遵循Equatable协议,为什么有时可以不显式实现运算符==?
答案: 对于所有属性也符合Equatable的结构,Swift会自动合成运算符==的实现。但是,如果类型中包含不符合Equatable的属性,或者类型是具有自定义继承的类,则不会发生合成,需手动实现运算符。
struct Point: Equatable { var x: Int var y: Int // 不需要实现==,它会自动合成 }
故事
在一个项目中,开发人员在一个已经符合
Equatable的结构中添加了UIImage类型的属性。出现编译错误,因为UIImage未实现Equatable,因此无法自动合成==。解决方案是手动实现运算符==,仅比较对逻辑重要的属性。
故事
在向结构添加新属性后,但忘记在用户定义的运算符
==中添加其比较。这导致在处理集合时逻辑不正确,并在用户过滤器中出现错误。
故事
在项目中编写了一个没有实现
Equatable的自定义类,但尝试在Set中使用它。这导致运行时错误,因为Set要求元素是唯一的(因此,需要Equatable)。