为什么Swift的运算符重载需要实现为static类型方法?
自定义运算符必须声明为static的核心原因
- 运算符的调用逻辑和普通实例方法天然不匹配:实例方法的调用必须依托一个已存在的实例,语法为
实例.方法名(参数),调用主体是前置的实例本身。但运算符的所有操作数都是平权的输入参数,a + b中没有哪个操作数是天然的调用主体。如果强制设计为实例方法,相当于默认左操作数为调用主体,会极大限制运算符的使用场景:比如你要实现Double + Vector2D的运算逻辑,你不可能修改标准库的Double类型新增实例方法,但静态方法可以直接定义在Vector2D的扩展中,两个参数平权处理即可。 - 这是Swift避免全局命名空间污染的专门设计:不同于很多旧语言要求自定义运算符必须声明为全局函数的方案,Swift将自定义运算符的实现绑定到关联类型的静态方法上,编译器查找运算符实现时,只会在左右操作数对应的类型中检索静态方法,既不会出现全局函数重名冲突,也方便代码组织,所有和当前类型相关的运算符实现都可以统一放在类型的扩展中维护。
- 语法规则一致性的要求:前缀、后缀运算符(如
!a、a!)本身只有一个操作数,完全不存在调用主体,统一要求所有运算符声明为静态方法,也保证了不同类型运算符的声明规则一致,不需要额外区分适配。
你给出的示例代码如果移除static关键字,相当于把+运算符定义为了Vector2D的实例方法,仅支持vector.+(anotherVector)这种不符合运算符语法规则的调用方式,编译器自然会抛出如下错误:
在'Vector2D'扩展中声明的运算符'+'必须为'static'
你之前的猜测是正确的,Swift内置的运算符实现本身也都是对应类型的静态方法,自定义运算符遵循相同规则即可。
内容的提问来源于stack exchange,提问作者peacetype
相关产品推荐
相关产品推荐

