运算符重载

63 阅读1分钟

基本数据类型可以加减乘除运算,那结构体、枚举、类行不行?此时就需要重载运算符

第一种 重载方法:在全局区定义重载函数

struct Point{
  var x, y = 0 
}

// 第一种 重载方法:在全局区定义重载函数
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: 12, y: 23)
let p3 = p1 + p2

第二种 重载方法:将重载方法写在结构体内

struct Point{
  var x, y = 0 
  // 定义重载函数, 要类方法static
  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: 12, y: 23)
let p3 = p1 + p2

前缀、后缀方法重载 ++

struct Point{
  var x, y = 0 
  // 定义重载函数, 要类方法static
  static func + (p1: Point, p2: Point) -> Point {
    Point(x: p1.x + p2.x, y: p1.y + p2.y)
  }
  static func += (p1: inout Point, p2: Point) -> Point {
    p1 = p1 + p2
  }
  static prefix func ++ (p: inout Point) -> Point {
    p += Point(x: 1, y: 1)
    return p
  }
  static postfix func ++ (p: inout Point) -> Point {
    let tmp = p
    p += Point(x: 1, y: 1)
    return tmp
  }
}