13 如何为类和结构体自定义运算符实现

简介: 如何为类和结构体自定义运算符实现

运算符重载


  • 类和结构体可以为现有的运算符提供自定义的实现,成为运算符重载


image.png


image.png


一元运算符重载


  • 类与结构体也能提供标准一元运算符的实现
  • 要实现前缀或者后缀运算符,需要在声明运算符函数的时候在func关键字之前指定perfix或者postfix限定符


image.png


组合赋值运算符重载


  • 组合赋值运算符将赋值运算符(=)与其他运算符进行结合
  • 在实现的时候,需要把运算符的左参数设置成inout类型,因为这个参数的值会在运算符函数内直接被修改


image.png


等价运算符重载


  • 自定义类和结构体不接收等价运算符的默认实现,也就是所谓的“等于”运算符(==)和“不等于”运算符(!=)
  • 要使用等价运算符来检查你自己类型的等价,需要和其他中缀运算符一样提供一个“等于”运算符重载,并且遵循标准库Equatable协议


image.png


Swift为以下自定义类型提供等价运算符合成实现:

  • 只拥有遵循Equatable协议存储属性的结构体
  • 只拥有遵循Equatable协议关联类型的枚举
  • 没有关联类型的枚举


image.png


如何在Swift里定义自己的运算符


自定义运算符


  • 除了实现标准运算符,在Swift当中还可以声明和实现自定义运算符(custom operators)
  • 新的运算符要在全局作用域内,使用operator关键字进行声明,同时还要指定prefix、infix或者postfix限定符


image.png


自定义中缀运算符的优先级和结合性


  • 自定义的中缀(infix)运算符也可以指定优先级和结合性
  • 每一个自定义的中缀运算符都属于一个优先级组
  • 优先级组指定了自定义中缀运算符和其他中缀运算符的关系


image.png


//AdditionPrecedence -> 加法优先级

//MultiplicationPrecedence -> 乘法优先级


image.png


//更改了*^优先级,再看代码

//下方的MyPrecedence是定义了一个新的优先级, 它的优先级低于加法优先级


image.png





目录
相关文章
|
存储 Swift 索引
28 如何为类、结构体以及枚举添加属性
如何为类、结构体以及枚举添加属性
70 0
|
6月前
|
存储 程序员 C++
定义和使用结构体变量
定义和使用结构体变量
54 1
|
6月前
|
存储 C语言
定义结构体类型变量
定义结构体类型变量
40 0
|
6月前
|
程序员 C语言
结构体类型变量的定义
结构体类型变量的定义
39 0
|
6月前
|
存储 算法 C++
【C/C++ 关键字 存储类说明符】 深入理解C/C++中的static关键字:它的作用、限制和使用技巧
【C/C++ 关键字 存储类说明符】 深入理解C/C++中的static关键字:它的作用、限制和使用技巧
40 0
|
Java 编译器 C++
常量接口 vs 常量类 vs 枚举区别
把常量定义在接口里与类里都能通过编译,那2者到底有什么区别呢?
69 0
|
编译器 C++
类的默认成员函数、赋值运算符重载(一)
如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
90 0
|
存储 编译器 C++
类的默认成员函数、赋值运算符重载(二)
如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
63 0
定义了一个类A,S是类外的一个函数,通过A.S=S进行赋值
假设类 A 已经定义好了,现在可以通过 A.S = S 的方式将函数 S 赋值给类 A。这样做的效果是,将 S 函数作为类 A 的一个属性,并且可以通过该属性来调用函数 S。 下面是一个简单的例子:
|
C语言
不得不知道的结构体变量的定义和初始化方法
不得不知道的结构体变量的定义和初始化方法
142 0
不得不知道的结构体变量的定义和初始化方法