溢出运算符
Swift的算数运算符出现溢出时会抛出运行时错误
Swift有溢出运算符(&+、&-、&*),用来支持溢出运算
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.pngEquatable
要想得知2个实例是否等价,一般做法是遵守Equatable 协议,重载 == 运算符
与此同时,等价于重载 != 运算符
没有加Equatable 报错
struct Point Equatablel {.png static func 三二 (p1 Point, p2 Point) 一> Bool {.png想实现等价,首先要去遵守Equatable协议,如果看到没有遵守Equatable协议,依然可以做等价的,那么肯定是在底层就遵守了Equatable协议。
cllass Person Equatable {.pngComparable(比较大小)
struct Student.png想要比较2个实例的大小??
一般做法:
1.遵守Comparable 协议
2.重载相应的运算符
自定义运算符
自定义运算符?自己创建一个运算符,自己实现功能
prefix operator 前缀运算符.png precedencegroup 优先级组.png中缀运算符 需要自己去设置优先级关系
associativity 多个运算符运算关系
注意 assignment 是先处理可选链还是运算符。说白了,就是说在nil的情况能不能使用
11.png自定义的运算符,要继承自己设计的协议
struct Point、.png自定义前缀运算符
27 prefix operator +++.png
网友评论