一、定义
在Swift的官方文档中运算符重载叫做运算符函数(Operator Functions)。简单来讲主要实现以下三点:
- 对已有标准运算符实现的类型覆盖定义自己的函数实现。(重载Int的+号运算符)
- 使用已有的标准运算符对未实现该运算符的类型添加该运算符定义。(对CGPoint添加+号运算)
- 个性运算符
- 个性的运算符只能使用这些字符
/ = - + * % < > ! & | ^ . ~
- 新的运算符声明需在全局域使用
operator
关键字声明,可以声明为前缀、中缀、后缀的,分别用prefix、infix、postfix
修饰。
注:三元运算符a ? b : c
和默认的默认的赋值运算符=
是 不可重载的。
二、示例
1、一元运算符
-
前缀运算符
要在func
关键字前添加prefix
关键字修饰
extension CGPoint {
static prefix func - (point: CGPoint) -> CGPoint {
return CGPoint(x: -point.x, y: -point.y)
}
}
let p1 = CGPoint(x: 1, y: 1)
let p2 = -p1
// p2为 (-1, -1 )
-
后缀运算符
要在func
关键字前添加prefix
关键字修饰
extension CGPoint {
static postfix func ++ (point: CGPoint) -> CGPoint {
return CGPoint(x: point.x * 2, y: point.y * 2)
}
}
let p1 = CGPoint(x: 2, y: 2)
let p2 = p1++
// p2为 (4, 4 )
2、二元运算符
-
组合赋值运算符
extension CGPoint {
static func += (left: inout CGPoint, right: CGPoint) {
left = left + right
}
}
var p1 = CGPoint(x: 2, y: 2)
let p2 = CGPoint(x: 3, y: 3)
p1 += p2
// p1为 (5, 5 )
-
其它二元运算符
extension CGPoint {
static func + (left: inout CGPoint, right: CGPoint) {
return CGPoint(x: left.x + right.x, y: left.y + right.y)
}
}
let p1 = CGPoint(x: 2, y: 2)
let p2 = CGPoint(x: 3, y: 3)
let p3 = p1 + p2
// p1为 (5, 5 )
3、自定义运算符
prefix operator +++
extension CGPoint {
static prefix func +++ (point: CGPoint) -> CGPoint {
return CGPoint(x: point.x * 3, y: point.y * 3)
}
}
let p1 = CGPoint(x: 2, y: 2)
let p2 = +++p1
// p2为 (6, 6 )