美文网首页
高级运算符

高级运算符

作者: MissSunRise | 来源:发表于2021-08-02 17:06 被阅读0次

    溢出运算符

    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

    相关文章

      网友评论

          本文标题:高级运算符

          本文链接:https://www.haomeiwen.com/subject/dxdjvltx.html