Swift-技巧(十一)重写运算符
摘要
基础数据的运算可以直接使用四则运算符。在 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 结构体的,所以和坐标相关的重写的运算符可以写在 CGPoint 的 extension 中,避免重写方法影响到系统级别的运算符
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-技巧(十一)重写运算符的更多相关文章
- Swift 学习- 03 -- 基本运算符
// 运算符是检查,改变,合并值的特殊符号或短语, // swift 支持大部分标准的 C语言的运算符, 且改进许多特性来减少常规编码错误. /* 如: 赋值符 (=) 不返回值, 以防止把想要判断相 ...
- .htaccess技巧: URL重写(Rewrite)与重定向(Redirect) (转)
目录 Table of Contents 一.准备开始:mod_rewrite 二.利用.htaccess实现URL重写(rewrite)与URL重定向(redirect) 将.htm页面映射到.ph ...
- swift 笔记 (二十一) —— 高级运算符
高级运算符 位运算符 按位取反: ~ 按位与运算: & 按位或运算: | 按位异或运算: ^ 按位左移运算: << 按位右移动算: >> 溢出运算符 自从swif ...
- Swift入门教程:基本运算符
基本运算符 Swift所支持的基本运算符 赋值运算符:= 复合赋值运算符:+=.-= 算数运算符:+.-.*./ 求余运算符:% 自增.自减运算符:++.-- 比较运算符:==.!=.>.< ...
- swift 第十一课 结构体定义model类
结构体是可以作为 model 类使用的不过也要 写下的创建方法 import UIKit/***创建一个model 结构,重写init 方法,结构体的属性不能出现可选类型**/ struct Mode ...
- Swift数组的加法运算符用法:array1 += array2
var stringList1 = [String]() //创建String类型空数组 var stringList2 = ["1", "3", " ...
- Eclipse用法和技巧十一:分栏显示
在编码的时候,有时候需要同时看到两个文件的代码.或者在代码走读的时候,能同时看到两个文件的代码能加快我们对代码的理解.来看看如何在eclipse中同时显示两个文件的代码. 步骤一:拖住一 ...
- .htaccess技巧: URL重写(Rewrite)与重定向
URL重定向是.htaccess的重头戏,它可以将长地址转为短地址.将动态地址转为静态地址.重定向丢失的页面.防止盗链.实现自动语言转换等.笔者觉得难点是在正则表达式的运用和理解上.有关htacces ...
- Swift 基本数据类型与运算符表达式
// // main.swift // LessonSwift01 // // Created by lanouhn on 16/1/25. // Copyright © 2016年 齐彦坤. All ...
随机推荐
- JavaScript中的this对象指向理解
在JavaScript中,this不是固定不变的,它的指向取决于上下文环境,一般的,认为this指向使用它时所在的对象.主要有以下几类指向: 在方法中,this 表示该方法所属的对象. 如果单独使用, ...
- Hadoop的安装与部署
一.硬件及环境 服务器:3台,IP分别为:192.168.100.105.192.168.100.110.192.168.100.115 操作系统:Ubuntu Server 18.04 JDK:1. ...
- Python ImportError: cannot import name ABC
Python 3.5.2 测试可以运行 import sys from abc import ABC,abstractmethod class MyBase(ABC): @abstractmethod ...
- 51nod_1006 最长公共子序列,输出路径【DP】
题意: 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...
- 测试平台系列(72) 了解ApScheduler基本用法
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们调研了一下市面上 ...
- Spark记录(一):Spark全景概述
一.Spark是什么 Spark是一个开源的大数据处理引擎. 二.Spark的主要组件如下图所示: 三.Spark运行时架构 Spark共有三种运行模式:本地模式.集群模式.客户端模式. 生产环境基 ...
- C++ new 运算符 用法总结
C++ new 运算符 用法总结 使用 new 运算符 分配内存 并 初始化 1.分配内存初始化标量类型(如 int 或 double),在类型名后加初始值,并用小括号括起,C++11中也支持大括号. ...
- Linux USB (目录)
1.USB 总线简介 2.USB 协议分析 3.USB Host 详解 4.USB Device 详解 5.usbip (USB Over IP) 使用实例
- 【JAVA】笔记(3)---封装;如何选择声明静态变量还是实例变量;如何选择声明静态方法还是实例方法;静态代码块与实例代码块的执行顺序与用途;
封装: 1.目的:保证对象中的实例变量无法随意修改/访问,只能通过我们自己设定的入口,出口(set / get)来间接操作:屏蔽类中复杂的结构,使我们程序员在主方法中关联对象写代码时,思路/代码格式更 ...
- Django笔记&教程 6-2 表单(Form)基础操作
Django 自学笔记兼学习教程第6章第2节--表单(Form)基础操作 点击查看教程总目录 1 - 编写表单类 创建新的表单类的代码,一般写到一个专门的forms.py文件中(一般放在对应的app文 ...