Swift学习~高级运算符

31 阅读2分钟

溢出运算符

在基本运算符之前加上&,会让本身超出运算部分不会崩溃报错,计算结果随着运算符向前或者向后作数据计算。

举个🌰 uint8最大值是255,如果此时+1,正常情况谁报错,但是如果加了溢出运算符,那么此时的值是0,uint8最小值是0,如果此时-1,正常情况谁报错,但是如果加了溢出运算符,那么此时的值是255。

运算符重载

可以通过重载运算符比如说 + - * / 实现结构体变量的运算,具体实现规则自己定义。比如p1(1,2),p2(1,2),正常情况两者无法相加,在结构体内部声明静态加号的重载方法,输出p3(2,4).

Equaltable

等号协议,可以通过这个协议实现自定义的类内部部分成员如果相等就判定对象相等。前提是要实现**static** **func** == (lhs: Person, rhs: Person) -> Bool (这里的person是我自定义的类) 这个必须实现的方法,可以不用在类后面标注Equaltable,但是建议标注,第一是代码规范,第二是方便以后泛型引用。

系统的枚举、Int、String等常用的类已经提供了Equaltable协议,可以直接比较,前提是内部没有关联的数据类型或者说关联的数据类型已经遵守了Equaltable协议。

如果实现了Equaltabl协议,没有省略写法,那么在外面调用比较的时候,!=也是可以用的,系统会生成,但是如果省略了:Equaltabl,那么这么写就报错了,不知道是苹果的bug还是故意这么搞得。而且在比较存在其他关联类型的数据类型的时候,必须指定Equaltabl协议,否则报错。

截屏2023-04-11 12.20.58.png

截屏2023-04-11 12.21.09.png

注意引用类型如果要比较是否指向的是同一个对象。可以使用===或者!==

Comparable

比较两个实例的大小。

截屏2023-04-11 12.30.51.png

自定义运算符

[前缀后缀中缀] operator [自定义的符号]

如果是中缀,还需要指定优先级组

🌰 (prefix operator ++++、infix operator +-+ : PlusMinusPercedence)