Swift5.1学习随笔之自定义运算符(Custom Opera

2020-05-13  本文已影响0人  SAW_

自定义运算符就是无中生有

prefix operator 前缀运算符
postfix operator 后缀运算符
infix operator 中缀运算符:优先级组

/*
 associativity:多个运算符放一起,是从左算到右,还是从右算到左的差别
 none:代表没有结合性
 比如 a1 + a2 + a3,加号的默认结合性为从左到右,先算 a1 + a2,再算 + a3。
 如果为none,不允许连续出现,只能一个加法存在
 */
precedencegroup 优先级组 {
    associativity: 结合性(left\right\none) 
    higherThan: 比谁的优先级高
    lowerThan: 比谁的优先级低
    assignment: true 代表再可以选链操作中拥有跟赋值运算符一样的优先级
}

前缀运算符例子🌰:

prefix operator +++
prefix func +++(_ i: inout Int) {
    i += 2
}

var age = 10
+++age
print(age) // 12

解释下优先级组内部参数的具体例子使用:
自定义一个+-运算符:

infix operator +- : PlusMinusPrecedenc
precedencegroup PlusMinusPrecedenc {
    associativity: none //代表没有结合性
    higherThan: AdditionPrecedence //高于+优先级
    lowerThan: MultiplicationPrecedence //低于*优先级
    assignment: true
}

实现运算符:

struct Point {
    var x = 0, y = 0
    static func +- (p1: Point, p2: Point) -> Point {
        Point(x: p1.x + p2.x, y: p1.y - p2.y)
    }
}

var p1 = Point(x: 10, y: 20)
var p2 = Point(x: 5, y: 15)
var p3 = p1 +- p2
print(p3) // Point(x: 15, y: 5)

//报错:Adjacent operators are in non-associative precedence group 'PlusMinusPrecedenc'
//因为associativity为none,没有结合性,不允许出现多个运算符
var p4 = p1 +- p2 +- p1

如果associativityleft,允许多个运算符:

//因为associativity为left,允许多个运算符
var p5 = p1 +- p2 +- p1
print(p5) //Point(x: 25, y: -15)

看下assignment: true代表什么:

class Person {
    var age = 0
    var point: Point = Point()
}

func getAge() -> Int { 10 }

var per: Person? = Person()
per?.age = getAge()

= 在计算的时候,会先判断左边可选项,如果pernil,运算不会执行,如果per不为nil,计算会进行。

per?.point +- Point(x: 10, y: 30)

assignment: true代表的意思是一样的:+- 也是一样,会先判断左边是否为nil, 如果为是空的话,+- Point(x: 10, y: 30)不会执行

上一篇下一篇

猜你喜欢

热点阅读