Swift-----運算符重載


1. 現有一個向量,我們重載它的“+”、“-”、“*”、“+=”運算符。

 注意: “=”是不可以進行重載的。

struct Vector3 {
    
    var x: Double = 0.0
    var y: Double = 0.0
    var z: Double = 0.0

}

// 重載加號(+)
func + (left: Vector3, right: Vector3) -> Vector3 {
    return Vector3(x: left.x + right.x, y: left.y + right.y, z: left.z + right.z)
}

// 重載減號(-)
func - (left: Vector3, right: Vector3) -> Vector3 {
    return Vector3(x: left.x - right.x, y: left.y - right.y, z: left.z - right.z)
}

// 重載乘號(*)
func *(left: Vector3, right: Vector3) -> Double {
    return left.x * right.x + left.y * right.y + left.z * right.z
}

// 重載負號(-),只有一個參數  由於不知道“-”是放在參數的左側還是右側,故需要添加關鍵字prefix,代表“-”是在參數的左側
prefix func - (value: Vector3) -> Vector3 {
    return Vector3(x: -value.x, y: -value.y, z: -value.z)
}

// 重載 +=  由於是把該操作會使left值發生改變,故left需要用到關鍵字 inout;由於“+”方法在之前定義過,故在這個方法中可以直接使用“+”方法。
func += (left: inout Vector3, right: Vector3){
    left = left + right
}

var v1 = Vector3(x: 1, y: 1, z: 1)
let v2 = Vector3(x: 3, y: 4, z: 5)

v1 + v2  // {x: 4, y: 5, z: 6}
v1 - v2  // {x: -2, y: -3, z: -4}
v1 * v2  // 12
-v1    // {x: -1, y: -1, z: -1}

v1 += v2  
v1    // {x: 4, y: 5, z: 6}

 2. 重載比較運算符

func == (left: Vector3, right: Vector3) -> Bool {
    return left.x == right.x && left.y == right.y && left.z == right.z
}

func != (left: Vector3, right: Vector3) -> Bool {
    return !(left == right)
}

func > (left: Vector3, right: Vector3) -> Bool {
    
    if left.x != right.x {return left.x > right.x}
    if left.y != right.y {return left.y > right.y}
    if left.z != right.z {return left.z > right.z}
    
    return false
}

func >= (left: Vector3, right: Vector3) -> Bool {
    return left > right || left == right
}

func < (left: Vector3, right: Vector3) -> Bool {
    return !(left >= right)
}

var v1 = Vector3(x: 1, y: 1, z: 1)
let v2 = Vector3(x: 3, y: 4, z: 5)

v1 == v2  // false
v1 != v2  // true
v1 > v2   // false
v1 >= v2  // false
v1 < v2   // true

 3 自定義運算符

(1)對向量定義一個“+++”運算符,類似Int中的“++”運算符

// 對於系統中沒有的運算符,需要通過 operator 來定義操作符,prefix表示操作符應在參數的前面
prefix
operator +++ prefix func +++ (vector: inout Vector3) -> Vector3 { let vec = vector vector += Vector3(x: 1.0, y: 1.0, z: 1.0) return vec } // postfix表示操作符應在參數的后面 postfix operator +++ postfix func +++ (vector: inout Vector3) -> Vector3 { vector += Vector3(x: 1.0, y: 1.0, z: 1.0) return vector } var vector1 = Vector3(x: 1, y: 2, z: 3) // {x: 1, y: 2, z: 3} vector1+++                   // {x: 2, y: 3, z: 4} vector1                     // {x: 2, y: 3, z: 4} var vector2 = Vector3(x: 1, y: 2, z: 3) // {x: 1, y: 2, z: 3} +++vector2                   // {x: 1, y: 2, z: 3} vect                      // {x: 2, y: 3, z: 4}

(2) 自定義一個中間運算符 infix

struct Vector3 {
    
    var x: Double = 0.0
    var y: Double = 0.0
    var z: Double = 0.0
    
    func length() -> Double {
        return sqrt(x * x + y * y + z * z)
    }
}

// 重載乘號(*)
func *(left: Vector3, right: Vector3) -> Double {
    return left.x * right.x + left.y * right.y + left.z * right.z
}

var vector3 = Vector3(x: 1, y: 2, z: 3)
var vector4 = Vector3(x: 2, y: 5, z: -3)

/*
在 swift 2 中自定義操作符
infix operator ^ {
    associativity left    // 左結合
    precedence 145    // 加法是140, 乘法是150. 默認是140。表示優先級高於加法,低於乘法
}
*/

// 在Swift 3 中上面的定義會出現警告信息:Operator should no longer be declared with body;use a precedence group instead
// 在Swift 3 中應該如下自定義操作符
infix operator ^: ATPrecedence
precedencegroup ATPrecedence {
    associativity: left                 // 表示左結合
    higherThan: AdditionPrecedence      // AdditionPrecedence表示加法,優先級高於加法
    lowerThan: MultiplicationPrecedence // MultiplicationPrecedence表示乘法,優先級低於乘法
}

func ^(left: Vector3, right: Vector3) -> Double {
    return acos((left * right) / (left.length() * right.length()))
}

vector3 ^ vector4
infix operator **: BTPrecedence
precedencegroup BTPrecedence {
    associativity: left        // 左結合
    higherThan: AdditionPrecedence  // 優先級高於加法運算符
}

func **(x: Double, y: Double) -> Double {
    return pow(x, y)
}

2 ** 3 ** 2     // 64
1 + 2 ** 3 ** 2 // 65
infix operator **: BTPrecedence
precedencegroup BTPrecedence {
    associativity: right      //右結合
    lowerThan: AdditionPrecedence // 優先級低於加法運算符
}

func **(x: Double, y: Double) -> Double {
    return pow(x, y)
}

2 ** 3 ** 2     // 512
1 + 2 ** 3 ** 2  //19683

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM