摘要

基础数据的运算可以直接使用四则运算符。在 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
}

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

题外话

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

Swift-技巧(十一)重写运算符的更多相关文章

  1. Swift 学习- 03 -- 基本运算符

    // 运算符是检查,改变,合并值的特殊符号或短语, // swift 支持大部分标准的 C语言的运算符, 且改进许多特性来减少常规编码错误. /* 如: 赋值符 (=) 不返回值, 以防止把想要判断相 ...

  2. .htaccess技巧: URL重写(Rewrite)与重定向(Redirect) (转)

    目录 Table of Contents 一.准备开始:mod_rewrite 二.利用.htaccess实现URL重写(rewrite)与URL重定向(redirect) 将.htm页面映射到.ph ...

  3. swift 笔记 (二十一) —— 高级运算符

    高级运算符 位运算符 按位取反: ~ 按位与运算:  & 按位或运算:  | 按位异或运算:  ^ 按位左移运算: << 按位右移动算: >> 溢出运算符 自从swif ...

  4. Swift入门教程:基本运算符

    基本运算符 Swift所支持的基本运算符 赋值运算符:= 复合赋值运算符:+=.-= 算数运算符:+.-.*./ 求余运算符:% 自增.自减运算符:++.-- 比较运算符:==.!=.>.< ...

  5. swift 第十一课 结构体定义model类

    结构体是可以作为 model 类使用的不过也要 写下的创建方法 import UIKit/***创建一个model 结构,重写init 方法,结构体的属性不能出现可选类型**/ struct Mode ...

  6. Swift数组的加法运算符用法:array1 += array2

    var stringList1 = [String]() //创建String类型空数组 var stringList2 = ["1", "3", " ...

  7. Eclipse用法和技巧十一:分栏显示

    在编码的时候,有时候需要同时看到两个文件的代码.或者在代码走读的时候,能同时看到两个文件的代码能加快我们对代码的理解.来看看如何在eclipse中同时显示两个文件的代码.        步骤一:拖住一 ...

  8. .htaccess技巧: URL重写(Rewrite)与重定向

    URL重定向是.htaccess的重头戏,它可以将长地址转为短地址.将动态地址转为静态地址.重定向丢失的页面.防止盗链.实现自动语言转换等.笔者觉得难点是在正则表达式的运用和理解上.有关htacces ...

  9. Swift 基本数据类型与运算符表达式

    // // main.swift // LessonSwift01 // // Created by lanouhn on 16/1/25. // Copyright © 2016年 齐彦坤. All ...

随机推荐

  1. uvm_cookbook--DUT-Testbench Connections--Abstract-Concrete Class Connections

    抽象和具体class的连接 An alternative to using a virtual interface handle for DUT to UVM testbench connection ...

  2. VirtualBox Share Folder

    转载:https://www.cnblogs.com/Dennis-mi/articles/5896586.html 使用virtualbox最方便的host-guest交换文件方案莫过于共享文件夹功 ...

  3. DeWeb和WebXone的区别

    DeWeb和WebXone的区别 相同点: 1 两者为同一开发者研发.QQ:45300355,碧树西风 2 都是为了解决Delphi开发Web的问题 区别: 1 WebXone采用的ActiveX/N ...

  4. kubernetes创建用户

    创建k8s User Account 使用openssl方法创建普通用户 准备工作 1 2 3 4 mkdir /root/pki/ 将k8s ca.pem  ca-key.pem 证书拷贝到此目录 ...

  5. NOIP模拟92&93(多校26&27)

    前言 由于太菜了,多校26 只改出来了 T1 ,于是直接并在一起写啦~~~. T0 NOIP 2018 解题思路 第一次考场上面写三分,然而我并不知道三分无法处理不是严格单峰的情况,但凡有一个平台都不 ...

  6. 日志框架-logtube

    Logtube 是什么 logtube 框架是基于 slf4j的一个日志框架封装, 源码地址: https://github.com/logtube 基于 SLF4J框架, 扩展了日志输出格式 (兼容 ...

  7. MySQL基础语句(MySQL内置函数 )

    MySQL 字符串函数 函数 描述 实例 ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码. 返回 CustomerName 字段第一个字母的 ASCII 码: SELECT ASCI ...

  8. php 数组(2)

    数组排序算法 冒泡排序,是一种计算机科学领域的较简单的排序算法.它重复地访问要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们减缓过来.走访数列的工作室重复的进行直到没有再需要交换,也就是说该 ...

  9. Windows操作系统安全加固基线检测脚本

    一.背景信息 在我们的安全运维工作中经常需要进行安全基线配置和检查,所谓的安全基线配置就是系统的最基础的安全配置,安全基线检查涉及操作系统.中间件.数据库.甚至是交换机等网络基础设备的检查,面对如此繁 ...

  10. 青龙+Nvjdc短信登陆对接Xdd-plus推送+Ninja CK登陆教程(11.23更新)

    一.准备工作 1.shh工具(powshell.gitbash等等) 2.购买一台云服务器(阿里云.腾讯云都可以) 3.安装宝塔面板 宝塔Linux面板安装教程 - 2021年8月18日更新 - 7. ...