怎么做可以把下圖中相同的的款號數量一鍵整理成一個款號然后款號后面就是這個款的總數
701
2022-05-30
一、函數簡介
Swift 函數用來完成特定任務的獨立的代碼塊。
Swift 使用一個統一的語法來表示簡單的 C 語言風格的函數到復雜的 Objective-C 語言風格的方法:
函數聲明:告訴編譯器函數的名字,返回類型及參數。
函數定義:提供了函數的實體。
Swift 函數包含了參數類型及返回值類型。
二、函數定義
Swift 定義函數使用關鍵字 func,定義函數的時候,可以指定一個或多個輸入參數和一個返回值類型。
每個函數都有一個函數名來描述它的功能,通過函數名以及對應類型的參數值來調用這個函數,函數的參數傳遞的順序必須與參數列表相同。
函數的實參傳遞的順序必須與形參列表相同,-> 后定義函數的返回值類型。
① 一般用法
不帶參數:
func pi() -> Double { return 3.1415 } pi()
帶參數:
// 求和 // // 將兩個整數相加 // - Parameters: // - v1: v1 第一個整數 // - v2: v2 第二個整數 // - Returns: 2個整數的和 // // - Note : 傳入2個整數即可 func sum(v1: Int,v2: Int) -> Int { v1 + v2 } sum(v1: 10, v2: 20)
說明:
所有的函數前面都用 func 來修飾;
函數名()的()里寫的是參數,這里是虛參,也就是參數名稱;
函數的參數默認是常量,而且只能是常量;
返回值是寫在參數的后面,并且使用 -> 隔開,sum 函數返回的是 Int 類型;
在調用時也需要加上參數名稱,這樣傳值會更準確;
在 sum 函數中我寫了文檔注釋,這樣便于后續維護,而且在調用函數時可以更加明確函數的職責;
因為是單一的表達式,所以無需寫 return,編譯期會自動判斷。
注意:
若沒有返回值有三種寫法:返回 Void,Void 其實就是(),Void 是 () 空元祖的別名(注意 Void 的 V 是大寫,跟其他語言不一樣),返回(),也就是直接返回空元組;
也可以不寫返回值就表示沒有返回值;
如果整個函數體只是簡單的單一表達式,可以不寫 return 來返回,編譯器會自動增加 return;
形參默認是 let,也只能是 let,所以以后就不要寫就行。
② 返回元組
如下所示:
func calculate(v1: Int,v2: Int) -> (sum: Int,diffence: Int,average: Int) { let sum = v1+v2 return(sum,v1-v2,sum>>1) } let result = calculate(v1: 20, v2: 10) result.sum result.diffence result.average result.0 result.1 result.2
運行結果:
說明:
以元組的形式返回就可以一次性得到多個返回值;
函數接收的時候就直接用一個 let 或 var 就行,因為是不確定數據類型的,所以可以接收任意類型;
接收后使用上就和正常的元組一樣,可以通過標識符取用,也可以使用下標取用。
三、函數參數
① 參數標簽
Swift 有參數標簽這個東西,常見的參數名稱是為了在函數內部有更好的語義化,而參數標簽是為了再外界調用時有更好的語義化:
// 函數標簽的案例 func goToWork(at time: String) { // 內部語義化:this time is time print("this time is \(time)") } goToWork(at: "08:00") // 外部語義化:go to work at 08:00 // 省略參數標簽 func sum(_ v1: Int, _ v2: Int) -> Int { v1 + v2 } sum(10, 20)
說明:
在函數定義中使用的是 time 時間,這樣更易讀,this time is 08:00;
在函數調用時用 go to work at 08:00 這樣來寫更易讀;
在定義函數時需要加上 at 這個參數標簽;
函數的一個參數既有在函數內部使用的函數名稱,也有在函數外使用的函數標簽;
函數標簽可以省略,使用_就可以省略,此時外部調用時就無需使用參數標簽。
注意:
加_省略和不寫參數標簽是不一樣的;
這種情況在調用時就可以直接傳值,如果是定義時不寫參數標簽,在外部調用時仍然要寫參數名稱,而不能直接寫參數。
② 默認參數
可以在定義函數時添加默認參數時,這樣在調用函數時可以不傳入這個參數的值:
func check(name: String = "nobody", age: Int,job: String = "none") -> () { print("name=\(name),age=\(age),job=\(job)") } check(age: 18) check(name: "wy", age: 18, job: "iOS") check(age: 18,job: "iOS")
執行結果:
ame=nobody,age=18,job=none name=wy,age=18,job=iOS name=nobody,age=18,job=iOS
說明:
在函數中 name 和 job 參數有自己的默認參數值;
在調用時函數時可以不給 name 和 job 傳值,函數內部會使用默認參數值來計算;
但是 age 必須要傳值,因為沒有默認參數值;
在傳值時會使用到參數標簽所以不會有歧義,可以任意決定傳值的參數,這與 C 語言不同。
③ 可變參數
在 Swift 中使用可變參數會很方便,當然了和其他語言一樣其實在內部也是編譯成一個數組:
func sum(_ numbers: Int...) -> Int { var total = 0 for number in numbers { total += number } return total } sum(10,20,30,40) sum(10, 20)
說明:
傳入的參數中在數據類型的后面加上…,這樣就是可變參數;
在函數內部把這個參數看做數組來處理;
一個函數最多只能有 1 個可變參數;
緊跟在可變參數后面的參數不能省略參數標簽/參數名稱,否則無法區分這個值是哪個參數的。
四、函數內修改外部變量的值(inout 的使用)
函數的參數只能是常量,所以正常情況下無法修改這個參數,如果想要修改參數,就需要使用 inout 來修飾這個參數,這樣做并且不僅可以修改參數內部,還可以修改外部的變量。本質是將值傳遞改為了指針傳遞。
// inout的使用 func swapValues(_ v1: inout Int, _ v2: inout Int) -> Void { let tmp = v1 v1 = v2 v2 = tmp } var num1 = 10 var num2 = 20 swapValues(&num1, &num2) // 傳入地址(其實就是指針,雖然Swift中沒有指針變量的概念)
說明:
不同于其他語言,Swift 的虛參只能是常量,不能是變量,所以無法修改;
如果是值傳遞,也無法修改外部變量的值;
可以使用 inout 來修飾,就可以修改外部變量的值;
調用函數時傳入的值要傳入變量地址,而不是變量本身;
可變參數不可以加 inout;
inout 參數不可以有默認值。
五、函數類型
函數也有自己的數據類型,數據類型就是參數數據類型+返回值數據類型,這里的函數類型可以視作 OC 中 block,在使用上和 block 基本一樣,block 簡單說來其實就是可作為變量/參數/返回值的能夠捕獲變量的匿名函數;
如下所示,演示作為變量、參數、返回值的具體使用,可以看到和 block 的使用完全一致:
① 函數類型
函數的函數類型就是參數數據類型+返回值數據類型;
test() 函數的函數類型就是() -> ();
test2() 函數的數據類型為:(Int,String) -> (Int,Double)。
// 數據類型為:()->() 或者()->Void func test(){ print("lalala") } // 數據類型為:(Int,String) -> (Int,Double) func test2(a: Int,b: String) -> (Int,Double) { return(7,7.0) }
② 作為變量
定義一個函數類型的變量,就可以將這個函數賦值給這個變量,之后通過這個變量來調用函數;
通過函數變量調用時不需要參數標簽和參數名稱,直接傳值;
為更方便的說明,可以把定義變量和賦值參數分開寫了,其實也可以寫到一起。
//(Int,Int) -> Int func sum2(a:Int,b:Int) -> Int { a+b } // 1、通過函數的數據類型定義一個函數變量 var fn: (Int,Int) -> Int; // 2、賦值一個函數 fn = sum2(a:b:) // 3、調用 fn(2,3)
③ 作為參數傳遞
// 加法 func sum3(v1: Int, v2: Int) -> Int { v1+v2 } // 減法 func difference(v1: Int,v2: Int) -> Int { v1-v2 } // 通過傳入的函數和對變量進行對應的加減操作 // (Int, Int) -> Int 是mathFn參數的數據類型 func printResult(_ mathFn: (Int, Int) -> Int , _ a: Int, _ b:Int) { print("Result: \(mathFn(a,b))") } printResult(sum, 20, 10) printResult(difference, 20, 10)
在 printResult 函數中第一個參數就是一個函數,這里傳遞到時候參數的數據類型就是函數類型;
(Int, Int) -> Int 是 mathFn 參數的數據類型;
在 PrintResult 函數中就可以使用傳入的函數進行調用了,通過傳入的函數和對變量進行對應的加減操作。
④ 作為返回值
// +1 func next(_ input: Int) -> Int { input + 1 } // -1 func previous(_ input: Int) -> Int { input - 1 } // 通過傳入的Bool值判斷返回哪個函數 // (Int) -> Int是返回值類型,是個函數類型,因此返回函數 // 因為返回的是函數所以只寫名稱,不需要帶參數 func forward(_ forward: Bool) -> (Int) -> Int { forward ? next : previous } forward(true)(3) // 4 forward(false)(4) // 2
forward 函數的返回值類型是 (Int) -> Int,這是一個函數類型;
返回的是函數所以只寫名稱,不需要帶參數,如果帶參數就是具體的值;
forward(true) 得到的是函數 next,因此 next(3) 就是 4。
六、函數的嵌套
函數嵌套指的是函數內定義一個新的函數,外部的函數可以調用函數內定義的函數。實例如下:
import Cocoa func calcDecrement(forDecrement total: Int) -> () -> Int { var overallDecrement = 0 func decrementer() -> Int { overallDecrement -= total return overallDecrement } return decrementer } let decrem = calcDecrement(forDecrement: 30) print(decrem())
執行輸出結果為:
-30
Swift 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。