Swift 的函数和闭包
函數的關鍵字是 func ,函數定義的格式是:
func funcName(para:paraType) -> returnType{// code } 復制代碼函數的參數標簽
其中參數的那部分的詳細結構是用小括號括起來,參數名,冒號,參數類型: (number:Int)。 在默認情況下,函數的參數標簽使用參數名,或者用 _ 不使用參數標簽,也可以自定義標簽,我們定義一個奇葩的函數:
func 求和(數字1 num1:Float, 數字2 num2:Float) -> Float {return num1 + num2 } 復制代碼求和 就是方法名,數字1 就是自定義的參數標簽。調用時會顯示標簽:
let sum = 求和(數字1: 2, 數字2: 4) 復制代碼函數返回多個值
swift 還可以用元組返回多個返回值:
func compare(numarray:([Int])) -> (min:Int, max:Int) {var min = numarray[0]var max = numarray[0]for num in numarray {if num > max {max = num}else if num < min{min = num}}return (min, max) } 復制代碼調用時獲取返回值:
compare(numarray: [1, 2, 3, 4, 5]).max 復制代碼函數嵌套函數
swift 語法中函數可以嵌套函數,用于分割太長或者太復雜的函數:
// 不要在意邏輯,只是為了示例一下。。。 func sumWithArray(numArray:([Int])) -> Int{var sum = 0func add(num1:Int, num2:Int) -> Int{return num1 + num2}sum = add(num1: numArray[0], num2: numArray[1])return sum } 復制代碼返回一個函數
函數還可以用一個函數做為返回值
func makeMethod() -> ((Int)->(Int)) {func addOne(num:Int)->(Int){return num+1}return addOne } 復制代碼函數調用:
print("makeMethod()(1993): ",makeMethod()(1993)) // makeMethod()(1993): 1994 /** makeMethod() 返回的是一個函數,繼續傳入參數 1993,最后返回 1994 */ 復制代碼傳入一個函數
函數可以把一個函數當做返回值返回,也可以當做一個參數來傳入:
func sumOfMaxMin(numarray:([Int]),compare:(_ numarray:([Int]))->(min:Int, max:Int)) -> (Int) {return compare(numarray).max + compare(numarray).min } 復制代碼可以看到, sumOfMaxMin 函數有兩個參數:numarray:([Int]) 和 compare:(_ numarray:([Int]))->(min:Int, max:Int) 。其中 compare 是一個函數。
在調用的時候:
var sumOfMaxMinValue = sumOfMaxMin(numarray: [1, 2, 3, 4, 5],compare: compare) 復制代碼compare 是上個例子中的函數。當然,我們也可以不傳入一個現成已經定義和實現的函數:
var sumOfMaxMinValue = sumOfMaxMin(numarray: [1, 2, 3, 4, 5]) { (numarray:([Int])) -> (min: Int, max: Int) invar min = numarray[0]var max = numarray[0]for num in numarray {if num > max {max = num}else if num < min{min = num}}return (min, max) } 復制代碼函數是一種特殊的閉包
大家伙看到這里,肯定會一拍大腿:哎呦,這玩意不就是閉包嘛!
(The Swift Programming Language)函數實際上是一種特殊的閉包:它是一段能之后被調取的代碼。閉包中的代碼能訪問閉包所建作用域中能得到的變量和函數,即使閉包是在一個不同的作用域被執行的
我們可以使用{}來創建一個匿名閉包。使用in將參數和返回值類型聲明與閉包函數體進行分離。
let numArray:([Int]) = [1, 2, 3, 4, 5] var newNumArray:([Int]) = numArray.map({(num:Int) -> Int inlet newNum = num * 3return newNum }) 復制代碼閉包的簡寫
如果閉包的類型已知,那么可以省略參數和返回值的類型
let numArray:([Int]) = [1, 2, 3, 4, 5] var newNumArray:([Int]) = numArray.map({num inlet newNum = num * 3return newNum }) 復制代碼單個語句閉包會把它語句的值當做結果返回
let numArray:([Int]) = [1, 2, 3, 4, 5] var newNumArray:([Int]) = numArray.map({num innum * 3 }) 復制代碼如果把上面的閉包寫成一行的話
let numArray:([Int]) = [1, 2, 3, 4, 5] var newNumArray:([Int]) = numArray.map({num in num * 3}) 復制代碼我們可以通過參數位置而不是參數名字來引用參數,那么上面的代碼就變成這樣
let numArray:([Int]) = [1, 2, 3, 4, 5] var newNumArray:([Int]) = numArray.map({$0 * 3}) 復制代碼當一個閉包是傳給函數的唯一參數,我們可以完全忽略括號
let numArray:([Int]) = [1, 2, 3, 4, 5] var newNumArray:([Int]) = numArray.map{$0 * 3} 復制代碼我的博客:iosgg.cn/
總結
以上是生活随笔為你收集整理的Swift 的函数和闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到抓螃蟹和小龙虾追是什么意思
- 下一篇: 第 132 章 Example