美文网首页
Swift5.1学习随笔之自定义运算符(Custom Opera

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

作者: SAW_ | 来源:发表于2020-05-13 10:47 被阅读0次

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

    • 可以自定义新的运算符:在全局作用域使用operator进行声明
    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)不会执行

    相关文章

      网友评论

          本文标题:Swift5.1学习随笔之自定义运算符(Custom Opera

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