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
結構體的,所以和坐標相關的重寫的運算符可以寫在 CGPoint
的 extension
中,避免重寫方法影響到系統級別的運算符
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
}
使用上和基礎數據的 +=
方式也是一樣的。
題外話
時間倉促,說的東西可能不全面,在你查看的過程中遇到什麼問題,評論區給我留言,我會儘快回復