Swift-技巧(十一)重寫運算符

摘要

基礎數據的運算可以直接使用四則運算符。在 Swift 中也可以通過重寫四則運算符的方式,讓 struct 或者 class 創建的結構體或者對象也能像基礎數據那樣直接使用四則運算符。

Swift 中有經常用到加、減、乘、除的操作,在代碼中編寫這些操作,實現功能中需要的基礎計算。比如下面代碼中實現的加法操作。

let a = 1
let b = 2
let c = a + b
// c = 3

當遇到 struct 或者 class 中的變量做計算操作時,一般都是把屬性依次拿出來計算,比如兩個 CGPoint 的對象相加:

let point1 = CGPoint(x: 1, y: 2)
let point2 = CGPoint(x: 3, y: 4)

// point1 加 point2
let x = point1.x + point2.x
let y = point1.y + point2.y
let result = CGPoint(x: x, y: y)

看代碼裏面,兩個 point 相加要先得到 x 的和,y 的和,然後再創建新的座標,生成新的座標。

邏輯上是沒有問題的,如果多個地方出現這樣的相加操作,就想到把相加操作給封裝成一個函數:

func addFunc(with point1: CGPoint, point2: CGPoint) -> CGPoint {

    let x = point1.x + point2.x
    let y = point1.y + point2.y
    return CGPoint(x: x, y: y)
}

之後兩個座標的相加操作就可以直接調用 addFunc 函數:

let result = addFunc(with point1, point2)

這是常規的封裝處理,沒有毛病,就是有沒有更加好的封裝方式?比如直接用 + 這個操作呢?

Swift 中恰好有重寫運算符的方式,直接在 struct 或者 class 上使用加、減、乘、除這些操作。那麼如何重寫運算符呢

這裏依舊以相加兩個座標爲例,重寫加運算符:

static func + (_ point1: CGPoint, _ point2: CGPoint) -> CGPoint {
    return CGPoint(x: point1.x + point2.x, y: point1.y + point2.y)
}

代碼中的重寫格式一定要是 static func +(屬性...)。在函數體中的處理就按照正常的四則運算規則處理。

之後處理兩個座標相加時,就可以像最開始代碼中的那樣直接用 + 運算。

let result = point1 + point2

其他的減、乘、除等運算也可以依照這樣的重寫格式去處理。

進階

座標是 CGPoint 結構體的,所以和座標相關的重寫的運算符可以寫在 CGPointextension 中,避免重寫方法影響到系統級別的運算符

extension CGPoint {
  static func + (_ point1: CGPoint, _ point2: CGPoint) -> CGPoint {
      return CGPoint(x: point1.x + point2.x, y: point1.y + point2.y)
  }
}

這裏再實現 += 運算符,說明結構體自身運算後仍賦值到自身的場景,用到的是 inout 修飾。

static func += (point1: inout CGPoint, _ point2: CGPoint) {
    point1.x += point2.x
    point1.y += point2.y
}

使用上和基礎數據的 += 方式也是一樣的。

題外話

時間倉促,說的東西可能不全面,在你查看的過程中遇到什麼問題,評論區給我留言,我會盡快回復

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章