Swift函數語法分析和使用示例

      網友投稿 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,編譯期會自動判斷。

      注意:

      Swift之函數的語法分析和使用示例

      若沒有返回值有三種寫法:返回 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小時內刪除侵權內容。

      上一篇:機器學習十大經典算法之K-Means聚類算法
      下一篇:前端基礎知識第四章---CSS
      相關文章
      亚洲中文字幕成人在线| 色欲色欲天天天www亚洲伊| 亚洲国产精品一区二区九九 | 国产成A人亚洲精V品无码| 国产亚洲色婷婷久久99精品91| 亚洲国产成人a精品不卡在线| 爱爱帝国亚洲一区二区三区| 老牛精品亚洲成av人片| 国产精品亚洲片在线花蝴蝶| 亚洲精品无码久久不卡| 亚洲伊人成无码综合网| 亚洲色偷偷偷鲁综合| 日韩亚洲欧洲在线com91tv| 国产AV无码专区亚洲AV男同 | 久久亚洲精品11p| 国产精品亚洲精品爽爽| 亚洲精品偷拍视频免费观看| 亚洲一区二区三区国产精品| 亚洲女同成av人片在线观看| 亚洲国产精品va在线播放 | 国产成人+综合亚洲+天堂| 亚洲另类少妇17p| 亚洲男同帅GAY片在线观看| 亚洲gv猛男gv无码男同短文| 久久亚洲AV成人无码国产| 亚洲精品美女在线观看| 亚洲欧洲日产国码www| 91丁香亚洲综合社区| 亚洲精品无码久久久久秋霞| 国产亚洲视频在线观看网址| 亚洲中文无韩国r级电影| 亚洲AV无码成人专区片在线观看 | 朝桐光亚洲专区在线中文字幕| 亚洲国产精品13p| 国产亚洲av片在线观看16女人| 亚洲四虎永久在线播放| 亚洲AV成人噜噜无码网站| 亚洲成a人片在线不卡一二三区 | 亚洲国产一区二区三区| 亚洲人成人一区二区三区| 久久久婷婷五月亚洲97号色|