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





目录
相关文章
|
7月前
|
存储 Swift 索引
28 如何为类、结构体以及枚举添加属性
如何为类、结构体以及枚举添加属性
42 0
|
2月前
|
存储 C语言
定义结构体类型变量
定义结构体类型变量
9 1
|
2月前
|
程序员 C语言
结构体类型变量的定义
结构体类型变量的定义
9 0
|
6月前
|
C语言 C++
自定义类型枚举(下)
自定义类型枚举
20 0
|
12月前
|
编译器 C++
类的默认成员函数、赋值运算符重载(一)
如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
69 0
|
12月前
|
存储 编译器 C++
类的默认成员函数、赋值运算符重载(二)
如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
43 0
|
C语言
c语言 结构体变量的定义初始化,成员的访问赋值,无名结构体
----结构体概述: 结构体就是将很多不同类型的数据包含在一起。 比如里面包含学生姓名、年龄、成绩:char name[20] ; int age ; double score,这些包含的都叫做结构体的成员; 当信息非常多修改就会发生错误,用结构体就会比较方便。
144 0
定义了一个类A,S是类外的一个函数,通过A.S=S进行赋值
假设类 A 已经定义好了,现在可以通过 A.S = S 的方式将函数 S 赋值给类 A。这样做的效果是,将 S 函数作为类 A 的一个属性,并且可以通过该属性来调用函数 S。 下面是一个简单的例子:
|
C++
【五、运算符重载实例分析】运算符重载实例、重载的机制、步骤、返回值及参数确定、友元函数与成员函数
【五、运算符重载实例分析】运算符重载实例、重载的机制、步骤、返回值及参数确定、友元函数与成员函数
69 0
|
C语言
不得不知道的结构体变量的定义和初始化方法
不得不知道的结构体变量的定义和初始化方法
107 0
不得不知道的结构体变量的定义和初始化方法