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





目录
相关文章
|
存储 算法 编译器
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
297 1
|
算法 搜索推荐 C++
【C++STL基础入门】vector运算和遍历、排序、乱序算法
【C++STL基础入门】vector运算和遍历、排序、乱序算法
593 0
|
计算机视觉
OpenCV-通道合并cv::merge
OpenCV-通道合并cv::merge
300 0
|
11月前
|
监控 自动驾驶 5G
|
算法 开发者 索引
【C++11算法】random_shuffle和shuffle
【C++11算法】random_shuffle和shuffle
668 0
|
存储 前端开发 定位技术
osgEarth使用笔记4——加载矢量数据
osgEarth使用笔记4——加载矢量数据
503 0
|
消息中间件 Kubernetes NoSQL
组播详解及示例代码
组播详解及示例代码
|
计算机视觉
OpenCV(十五):拷贝图像
OpenCV(十五):拷贝图像
304 0
|
SQL 数据建模 索引
Elasticsearch 空值处理实战指南
1、引言 实战业务场景中,经常会遇到定义空值、检索指定空值数据的情况。 这时候,当我们翻看官方文档 null_value 部分,会看到如下的描述: Accepts a string value which is substituted for any explicit null values. Defaults to null, which means the field is treated as missing. 接受一个字符串值替换所有显式的空值。默认为null,这意味着该字段被视为丢失。 A null value cannot be indexed or searched. W
Elasticsearch 空值处理实战指南
|
人工智能 安全 架构师
2023中国国际服务贸易交易会,我们在这里!
2023中国国际服务贸易交易会,我们在这里!
1357 0

热门文章

最新文章