除了实现标准运算符,在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