本篇分為兩部分: 與別的語言不同,Swift 支持運算符的重載,運算符指的是“+,-,%,*”等操作運算符,從而使一些操作更加簡便。 在開發中,我們對於一些基本運算通常是這樣寫的: v3 的輸出結果為:3,7 但是,當這種二位數組過多時,如果我們依然用這種方式,我們的代碼將變得異常臃腫,程式員也會變
本篇分為兩部分:
1、Swift 中重載操作運算符的使用
2、Swfit 中 func 的參數修飾
1、Swift 中重載操作運算符的使用
與別的語言不同,Swift 支持運算符的重載,運算符指的是“+,-,%,*”等操作運算符,從而使一些操作更加簡便。
在開發中,我們對於一些基本運算通常是這樣寫的:
struct Vector2D { var x = 0.0 var y = 0.0 } let v1 = Vector2D(x: 2, y: 3) let v2 = Vector2D(x: 1, y: 4) let v3 = Vector2D(x: v1.x+v2.x, y: v1.y+v2.y)
v3 的輸出結果為:3,7
但是,當這種二位數組過多時,如果我們依然用這種方式,我們的代碼將變得異常臃腫,程式員也會變得沒有耐心,所以 Swift 為了提高工作效率,創造出了重載運算符這種文藝的編程方式,上面的代碼可以優化為:
// Swift 支持重載操作符這樣的特性,從而使一些計算更加簡便 func +(left: Vector2D, right:Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y) } let v = v1 + v2 + v3 // 再往後繼續加都可以
v 的輸出結果為:6,14
因為 +, -, * 這樣的操作符是因為 Swift 中已經有定義了,所以不會保錯,如果我們要加入新的操作符的話,需要先對其進行聲明
infix operator +* { // infix:表示要定義的是一個中位操作符,即前後都是輸入;其他的修飾還包括 prefix 和 postfix associativity none // associativity:定義結合律,規定計算順序,加法減法為 left,點乘用 none precedence 160 // precedence:運算的優先順序,Swift 中乘除的優先順序是150,加減是140 }
func +*(left: Vector2D, right:Vector2D) -> Double { return left.x * right.x + left.y * right.y } let result1 = v1 +* v2
result1 的輸出結果為:14.0
註意:Swift 的操作符是不能定義在局部域中的,因為至少會希望能在全局範圍內使用你的操作符,否則操作符就失去意義了
2、Swfit 中 func 的參數修飾
在 Swift 中所有的變數都被預設為不可變的,也就是用 let 進行聲明,在方法上也是如此,所以此代碼會報錯:func test(i: Int) -> Int
解決辦法:
func incrementor(var i: Int) -> Int { return ++i } print("計算後的結果為:\(incrementor(7))")
輸出結果:計算後的結果為:8
// 柯里化及多元組綜合使用, inout 修飾符曾在多元組中使用 func makeIncrementor(addNumber: Int) -> ((inout Int) -> ()) { func incrementor(inout variable: Int) -> () { variable += addNumber; print(variable); } return incrementor; } var i = 2; let addMethod = makeIncrementor(3) addMethod(&i) addMethod(&i) addMethod(&i) addMethod(&i)