大家也可以参考一下如下几篇博客:https://www.jianshu.com/p/fed5f9caa5fc
https://www.cnblogs.com/LilianChen/archive/2013/03/15/2961901.html
1、运算符重载栗子
struct Coordinate2D {
var x = 0.0,y = 0.0;
}
extension Coordinate2D {
static func + (left: Coordinate2D, right: Coordinate2D) -> Coordinate2D{
return Coordinate2D(x: left.x + right.x, y: left.y + right.y)
}
}
let vector = Coordinate2D(x:30 ,y:1.0)
let anotherVector = Coordinate2D(x: 2.0, y: 4.0)
let combinedVector = vector + anotherVector
print(combinedVector
2、一元运算符重载
/*
类与结构体也能提供标准一元运算符的实现。
要实现前缀或者后缀运算符,需要在
func关键字之前指定prefix(前缀)
或者 postfix(后缀)限定符
*/
//前缀
struct Coordinate2D {
var x = 0.0,y = 0.0;
}
extension Coordinate2D {
static prefix func - (vector: Coordinate2D) -> Coordinate2D{
return Coordinate2D(x: -vector.x, y: -vector.y)
}
}
let positive = Coordinate2D(x: 3.0, y: 4.0)
let negative = -positive
let alsopositive = -negative
//后缀
extension Coordinate2D {
static postfix func -- (vector: Coordinate2D) -> Coordinate2D{
return Coordinate2D(x: -vector.x, y: -vector.y)
}
}
var positive = Coordinate2D(x: 3.0, y: 4.0)
var negative = positive--
var alsopositive = negative-
3、组合赋值运算符重载
/*
组合赋值运算符重载
组合赋值运算符将赋值运算(=)与其它运算符进行结合
实现时,需要把运算符的左参数设置成 inout 类型(可以修改),
因为这个参数的值会在运算符函数内直接被修改
*/
struct Coordinate2D {
var x = 0.0,y = 0.0;
}
extension Coordinate2D {
static func += (left: inout Coordinate2D ,right: Coordinate2D) -> Coordinate2D{
// left.x = left.x + right.x
// left.y = left.y + right.y
return Coordinate2D(x: left.x + right.x, y: left.y + right.y )
}
}
var original = Coordinate2D(x: 1.0, y: 2.0)
let vectorToAdd = Coordinate2D(x: 3.0, y:4.0)
original += vectorToAd
4、等价运算符重载
/*
等价运算符重载
自定义类和结构体不接收等价运算符的默认实现,就是所谓的“等于“预算符(==)和 ”不等于”运算符 (!=)。
要使用等价运算符来检查你自己类型的等价,需要和其他中缀运算符一样提供一个“等于”运算符重载,并且遵循标准库的Equatable协议
*/
struct Coordinate2D {
var x = 0.0,y = 0.0;
}
extension Coordinate2D:Equatable {
static func == (left: Coordinate2D, right: Coordinate2D) ->Bool{
return (left.x == right.x) && (left.y == right.y)
}
}
5、等价运算符重载
/*
Swift 为以下自定义类型提供等价运算符合成实现
- 只是拥有遵循Equatable协议存储属性的结构体
- 只拥有遵循Equatable协议关联类型的枚举
- 没有关联类型的枚举
*/
struct Coordinate4D: Equatable{
var x = 0.0, y = 0.0 ,z = 0.0 ,f = 0.0
}
let coordinate1 = Coordinate4D(x:2.0 ,y: 3.0,z: 4.0 ,f: 5.0)
let coordinate2 = Coordinate4D(x:2.0 ,y: 3.0,z: 4.0,f: 5.0)
if (coordinate1 == coordinate2){
print("相等")
}