swift 自定义运算符

除了实现标准运算符,在swift当中还可以声明和实现自定义运算符(custom operators)

新的运算符要在全局作用域内,使用operator 关键字进行声明,同时还要指定prefix 、infix或者 postfix限定符

 

code

//: A UIKit based Playground for presenting user interface
  
import UIKit

struct Vector2D{
    var x = 0.0, y = 0.0

}

prefix operator +++
extension Vector2D{
 static func += (left: inout Vector2D,right:Vector2D) {
    left = Vector2D(x:left.x+right.x,y: left.y+right.y)
    }
    static prefix func +++ (vector:inout Vector2D)->Vector2D{
        vector += vector
        return vector
    }

}

var tobeDoubled = Vector2D(x:3.0,y: 1.0)
let afterDoubling = +++tobeDoubled
print(afterDoubling.x)

print(afterDoubling.y)

结果

6  2

自定义运算符的优先级和结合性

自定义中缀(infix)运算符也可以指定优先级和结合性

每一个自定义的中缀运算符都属于一个优先级组

优先级组置顶了一自定义中缀运算符和其他中缀运算符的关系

基本代码时这样的

precedencegroup MyPrecedence{
    associativity:left
    lowerThan:AdditionPrecedence
}

那谁看谁懵逼啊 我们先回顾前面博客的知识

正常的优先级大家想必九年义务教育都懂一点 加减第二 乘除第一

//: A UIKit based Playground for presenting user interface

import UIKit

struct Vector2D{
    var x = 0.0, y = 0.0
    
}

precedencegroup MyPrecedence{
    associativity:left
    lowerThan:AdditionPrecedence
}

infix operator +-:AdditionPrecedence
infix operator *^:MultiplicationPrecedence
extension Vector2D{
    
    static func +- (left:  Vector2D,right:Vector2D) ->Vector2D{
        return Vector2D(x:left.x+right.x,y: left.y-right.y)
    }
    static func *^ (left:  Vector2D,right:Vector2D) ->Vector2D{
        return Vector2D(x:left.x*right.x,y: left.y*left.y+right.y*right.y)
    }
}

let firstVector = Vector2D(x: 1.0, y: 2.0)
let secondVector = Vector2D(x: 3.0, y: 7.0)
let plusMinusVecotr = firstVector +- secondVector
let thirdVector = Vector2D(x: 2.0, y: 2.0)
let vector = firstVector +- secondVector *^ thirdVector
print(vector.x)
print(vector.y)

结果 7 -51 也就是先算乘除 后算加减

然后我们修改下下*^的优先级为我们自定义的优先级

//: A UIKit based Playground for presenting user interface

import UIKit

struct Vector2D{
    var x = 0.0, y = 0.0
    
}

precedencegroup MyPrecedence{
    associativity:left
    lowerThan:AdditionPrecedence
}

infix operator +-:AdditionPrecedence
infix operator *^:MyPrecedence
extension Vector2D{
    
    static func +- (left:  Vector2D,right:Vector2D) ->Vector2D{
        return Vector2D(x:left.x+right.x,y: left.y-right.y)
    }
    static func *^ (left:  Vector2D,right:Vector2D) ->Vector2D{
        return Vector2D(x:left.x*right.x,y: left.y*left.y+right.y*right.y)
    }
}

let firstVector = Vector2D(x: 1.0, y: 2.0)
let secondVector = Vector2D(x: 3.0, y: 7.0)
let plusMinusVecotr = firstVector +- secondVector
let thirdVector = Vector2D(x: 2.0, y: 2.0)
let vector = firstVector +- secondVector *^ thirdVector
print(vector.x)
print(vector.y)

结果就是

先算+- 再算乘除

结果就是

8 29

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值