函數的關鍵字是 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/