高级运算符

溢出运算符

Swift的算数运算符出现溢出时会抛出运行时错误
Swift有溢出运算符(&+、&-、&*),用来支持溢出运算

-128.png
print(Int8.min).png

Int8的最小数是-128,最大数是127

UInt8的最小数是0,最大数是255

print(v).png

提示会溢出

var.png
0x1090036d6 $936 ud2.png

运行时报错,说明了在计算的时候,如果超出了这个变量类型的大小,那么就会溢出,导致报错

怎么解决呢??

Var.png
-128.png

使用溢出运算符,可以不使其报错。

但是这里就有问题了。Int8最大数是127,为什么加1不是128,而是-128

原因是:这里做的不是数学中的加法,而是运算,Int8,是8位,里面的二进制全是1 ,加一会进位,得到的数,是-128的二进制

-UInt8_.png
UInt8.min.png

运算符重载

类、结构体、枚举可以为现有的运算符提供自定义的实现,这个操作叫做:运算符重载(说人话就是,平时用的运算符是一个方法,而我们可以自己去实现这个方法)

例如,我们可以方便的去做结构体的运算

struct Point {.png
Point(x:32 y 25).png

而写在全局可能对其他代码造成干扰,最好是谁使用,谁实现

struct Point.png

将重载方法放在结构体中,报错了….

因为这样写是一个实例方法,只有实例才能调用。我们需要加一个static来修正这个报错

struct Point {.png
static func += (p1 Point, p2 Point){.png
var.png

Equatable

要想得知2个实例是否等价,一般做法是遵守Equatable 协议,重载 == 运算符
与此同时,等价于重载 != 运算符

var p1 Point(x 10, y 12).png

没有加Equatable 报错

struct Point Equatablel {.png
static func 三二 (p1 Point, p2 Point) 一> Bool {.png

想实现等价,首先要去遵守Equatable协议,如果看到没有遵守Equatable协议,依然可以做等价的,那么肯定是在底层就遵守了Equatable协议。

cllass Person Equatable {.png

Comparable(比较大小)

struct Student.png

想要比较2个实例的大小??
一般做法:
1.遵守Comparable 协议
2.重载相应的运算符

自定义运算符

自定义运算符?自己创建一个运算符,自己实现功能

prefix operator 前缀运算符.png
precedencegroup 优先级组.png

中缀运算符 需要自己去设置优先级关系

associativity 多个运算符运算关系

注意 assignment 是先处理可选链还是运算符。说白了,就是说在nil的情况能不能使用

11.png

自定义的运算符,要继承自己设计的协议

struct Point、.png

自定义前缀运算符

27 prefix operator +++.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容