知识卡片
运算符本质是声明为静态方法的全局函数
内容
[[实现最小运算符换取整族比较能力]]中的==、<这类运算符在Swift标准库里是用infix operator == : ComparisonPrecedence声明的全局中缀函数,调用形式a == b只是==(a, b)的语法糖。给自定义类型实现某个运算符时要写成static func ==(lhs: Point, rhs: Point) -> Bool——之所以要加static,是因为编译器允许把运算符实现放进类型内部作用域来就近查找和组织代码,但这个函数本质上仍是作用于两个Point实例、而非”由某一个Point发起调用”的全局函数,用static标记明确表达”这不是实例方法”。这解释了运算符重载在语法上一个常被忽略的细节:写在协议里的运算符要求也必须标记static,否则编译器会报错——因为协议描述的从来都是”类型层面提供这个函数”,而不是”每个实例各自提供”。
参考来源
《Swift编程权威指南》第25章《Equatable和Comparable》