自定义运算符就是无中生有
- 可以自定义新的运算符:在全局作用域使用
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
如果associativity
为left
,允许多个运算符:
//因为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()
=
在计算的时候,会先判断左边可选项,如果per
为nil
,运算不会执行,如果per
不为nil
,计算会进行。
per?.point +- Point(x: 10, y: 30)
assignment: true
代表的意思是一样的:+-
也是一样,会先判断左边是否为nil
, 如果为是空的话,+- Point(x: 10, y: 30)
不会执行
网友评论