摘要

基础数据的运算可以直接使用四则运算符。在 Swift 中也可以通过重写四则运算符的方式,让 struct 或者 class 创建的结构体或者对象也能像基础数据那样直接使用四则运算符。

Swift 中有经常用到加、减、乘、除的操作,在代码中编写这些操作,实现功能中需要的基础计算。比如下面代码中实现的加法操作。

let a = 1
let b = 2
let c = a + b
// c = 3

当遇到 struct 或者 class 中的变量做计算操作时,一般都是把属性依次拿出来计算,比如两个 CGPoint 的对象相加:

let point1 = CGPoint(x: 1, y: 2)
let point2 = CGPoint(x: 3, y: 4) // point1 加 point2
let x = point1.x + point2.x
let y = point1.y + point2.y
let result = CGPoint(x: x, y: y)

看代码里面,两个 point 相加要先得到 x 的和,y 的和,然后再创建新的坐标,生成新的坐标。

逻辑上是没有问题的,如果多个地方出现这样的相加操作,就想到把相加操作给封装成一个函数:

func addFunc(with point1: CGPoint, point2: CGPoint) -> CGPoint {

    let x = point1.x + point2.x
let y = point1.y + point2.y
return CGPoint(x: x, y: y)
}

之后两个坐标的相加操作就可以直接调用 addFunc 函数:

let result = addFunc(with point1, point2)

这是常规的封装处理,没有毛病,就是有没有更加好的封装方式?比如直接用 + 这个操作呢?

Swift 中恰好有重写运算符的方式,直接在 struct 或者 class 上使用加、减、乘、除这些操作。那么如何重写运算符呢

这里依旧以相加两个坐标为例,重写加运算符:

static func + (_ point1: CGPoint, _ point2: CGPoint) -> CGPoint {
return CGPoint(x: point1.x + point2.x, y: point1.y + point2.y)
}

代码中的重写格式一定要是 static func +(属性...)。在函数体中的处理就按照正常的四则运算规则处理。

之后处理两个坐标相加时,就可以像最开始代码中的那样直接用 + 运算。

let result = point1 + point2

其他的减、乘、除等运算也可以依照这样的重写格式去处理。

进阶

坐标是 CGPoint 结构体的,所以和坐标相关的重写的运算符可以写在 CGPointextension 中,避免重写方法影响到系统级别的运算符

extension CGPoint {
static func + (_ point1: CGPoint, _ point2: CGPoint) -> CGPoint {
return CGPoint(x: point1.x + point2.x, y: point1.y + point2.y)
}
}

这里再实现 += 运算符,说明结构体自身运算后仍赋值到自身的场景,用到的是 inout 修饰。

static func += (point1: inout CGPoint, _ point2: CGPoint) {
point1.x += point2.x
point1.y += point2.y
}

使用上和基础数据的 += 方式也是一样的。

题外话

时间仓促,说的东西可能不全面,在你查看的过程中遇到什么问题,评论区给我留言,我会尽快回复

最新文章

  1. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③
  2. .net MVC中异常日志
  3. BZOJ4157 : 星际瘟疫
  4. C#中,接口不能被实例化,但存在特例
  5. Vmware虚拟机
  6. communication between threads 线程间通信 Programming Concurrent Activities 程序设计中的并发活动 Ada task 任务 Java thread 线程
  7. 第一篇 Replication:复制简介
  8. R cannot be resolved to a variable 解决办法
  9. PHP错误Warning: Cannot modify header information - headers already sent by解决方法
  10. js简易写法
  11. 如何设置SecureCRT快捷键
  12. C#使用AutoMapper6.2.2.0进行对象映射
  13. selenium中的xpath定位
  14. 为什么AI的翻译水平还远不能和人类相比?
  15. centos下搭建openstack的环境
  16. Cesium学习网址
  17. ELK部署详解--kibana
  18. Zookeeper应用之——选举(Election)
  19. Android打开相机进行人脸识别,使用虹软人脸识别引擎
  20. JMeter学习(三十四)使用jmeter来发送json/gzip格式数据(转载)

热门文章

  1. shell调用另一个脚本的三种方式fork/exec/source
  2. usb设备无法识别
  3. 重建二叉树 牛客网 剑指Offer
  4. AC-DCN ESXi
  5. Linux基本命令学习-文件基本操作1
  6. 暑假算法练习Day2
  7. Java 初始化与清理
  8. linux安装python3.6.1
  9. [loj3501]图函数
  10. [loj3343]超现实树