swift中的运算符重载(类和结构体自定义预算符)

大家也可以参考一下如下几篇博客: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("相等")
}

你可能感兴趣的:(swift中的运算符重载(类和结构体自定义预算符))