更新:2018.05.24
整理了一下demo:SwiftDemo
- 函數(shù)是一個組織在一起的程序代碼集合凉驻,用來完成某一個特定的功能甩鳄。
- Swift使用關(guān)鍵字`func進行函數(shù)的定義蚤氏。
- 定義一個函數(shù)時,可以定義一個或多個不同名稱、類型的值戚扳,作為函數(shù)的輸入?yún)?shù)。當函數(shù)完成是族吻,將返回出書定義的類型帽借。
- 每個函數(shù)都有一個函數(shù)名來描述它的功能珠增。通過函數(shù)名以及對應(yīng)類型的參數(shù)值,可以調(diào)用這個函數(shù)砍艾,函數(shù)的參數(shù)傳遞順序必須與參數(shù)列表中的順序相同蒂教。
函數(shù)格式如下:
func 函數(shù)名(參數(shù)變量: 類型, 參數(shù)變量: 類型) -> 返回類型 {
}
- 沒有參數(shù)也沒有返回值
func buildSubviews() {
}
- 有參數(shù)沒有返回值
func tableView(tableView: UITableView) {
}
- 沒有參數(shù)有返回值
func buildHeaderView() -> UIView {
}
- 有參數(shù)有返回值
func sum(num1: Int, num2: Int) -> Int {
}
當調(diào)用包含多個參數(shù)的函數(shù)時,必須要傳遞形同數(shù)量的參數(shù)脆荷。
為參數(shù)設(shè)置默認值
- Swfit中凝垛,可以為函數(shù)的參數(shù)設(shè)置默認值。
func sum (x:Int = 1, y:Int = 2) -> Int {
return x+y
}
在開發(fā)中蜓谋,有的時候就會遇到需要默認值的函數(shù)梦皮,如上,等號后面的就是默認值桃焕。當函數(shù)中有一個傳入?yún)?shù)沒有傳入時剑肯,就會采用默認值。
設(shè)置可變的參數(shù)數(shù)量
- 定義函數(shù)時观堂,如果不能確定傳入?yún)?shù)的數(shù)量让网,可通過變量類型后面加入
...
定義變量參數(shù)。 - 一個函數(shù)最多能有一個變量參數(shù)师痕,且必須是函數(shù)表中的最后一個溃睹。
- 一個函數(shù)如果有一個或多個參數(shù),變量參數(shù)一定放在最后胰坟。
func mean (numbers:Double...) -> Double {
if numbers.count==0 {
return 0.0
} else {
var temp :Double = 0
for number in numbers {
temp += number
}
return temp/Double(numbers.count)
}
}
這是一個求 Double類型平均值的函數(shù)丸凭,第二、三行代碼是為了防止沒有傳入?yún)?shù)導致程序崩潰腕铸。
下面是for循環(huán)累加除參數(shù)數(shù)量惜犀,求平均值。
函數(shù)作為參數(shù)和返回類型
-
函數(shù)作為參數(shù)
func smaller (num1:Int, num2:Int) -> Int {
return(num1 > num2) ? num2 : num1
}
func bigger (num1:Int, num2:Int) -> Int {
return(num1 > num2) ? num1 : num2
}
func printMathResult(mathFunction:(Int,Int)->Int,num1:Int,num2:Int) {
print("The result is \(mathFunction(num1,num2))" + ".")
}
這里是三個函數(shù):
- 第一個函數(shù)是求最小值 函數(shù)的類型是
(Int,Int)->Int
- 第二個函數(shù)是求最大值 函數(shù)的類型是
(Int,Int)->Int
- 第三個函數(shù)是把
mathFunction
作為一個參數(shù)傳入狠裹,參數(shù)類型是(Int,Int)->Int
虽界,該函數(shù)的另外兩個參數(shù)是Int
,即這個函數(shù)的功能是把后兩個傳入?yún)?shù)通過matchFunction
這個作為傳入?yún)?shù)的函數(shù)進行計算涛菠,然后輸出莉御。而matchFunction
這個函數(shù)做怎樣的操作,就需我們傳入了俗冻。這也是我們?yōu)槭裁匆獙懙谝粋€和第二個函數(shù)的目的礁叔。
printMathResult(mathFunction: smaller(num1:num2:), num1: 1, num2: 2)
printMathResult(mathFunction: bigger(num1:num2:), num1: 2, num2: 3)
-
函數(shù)作為返回類型
func smaller (num1:Int, num2:Int) -> Int {
return(num1 > num2) ? num2 : num1
}
func bigger (num1:Int, num2:Int) -> Int {
return(num1 > num2) ? num1 : num2
}
func chooseFunction(big:Bool) ->(Int,Int)->Int {
return big ? bigger : smaller
}
前兩個函數(shù)還是上面的兩個,求最大值和最小值迄薄。
只是這一次它們在第三個函數(shù)中作為返回參數(shù)存在琅关。
如果輸入的big
是true的話,就返回求最大值的函數(shù)讥蔽,反之返回求最小值的函數(shù)涣易。
然后我們可以在viewDidLoad()
或其他地方進行一些操作
let function = chooseFunction(big: true)
print(function(2,4))
我們定義了一個常量画机,并根據(jù)傳入函數(shù)的的參數(shù)值為true
將bigger
函數(shù)賦予function
常量。
function的返回值是
(Int,Int)->Int
嵌套函數(shù)
接著上面的例子新症,來搞一個嵌套函數(shù)
嵌套函數(shù)步氏,顧名思義就是在函數(shù)中有另外一個函數(shù)。函數(shù)里面的函數(shù)只在本函數(shù)中有作用徒爹。
func chooseNumber(big:Bool,number1:Int,number2:Int) {
func getSmaller() {
print((number1>number2) ? number2 : number1)
}
func getBigger() {
print((number1>number2) ? number1 : number2)
}
big ? getBigger() : getSmaller()
}
這個函數(shù)表示荚醒,在chooseNumber
函數(shù)中,有兩個函數(shù)即打印最大值函數(shù)getBigger
和打印最小值函數(shù)getSmaller
,由傳入的Bool
來控制調(diào)用哪個函數(shù)輸出數(shù)值隆嗅。
并且界阁,getBigger
和getSmaller
只能在函數(shù)chooseNumber
中使用。
函數(shù)的輸入輸出參數(shù)
- 如果想要一個函數(shù)可以修改參數(shù)的值榛瓮,并且這些修改在函數(shù)結(jié)束之后仍然存在,那就可以將參數(shù)定義為輸入輸出參數(shù)巫击,這可以通過在參數(shù)類型的前面加入
inout
關(guān)鍵字來實現(xiàn)禀晓。 - 同時,傳入函數(shù)的參數(shù)坝锰,只能是變量粹懒,不能是常量,當傳入的參數(shù)作為輸入輸出參數(shù)時顷级,需要在前面加上
&
符號凫乖,表示這個參數(shù)值是可以被修改的。
比如交換兩個傳入?yún)?shù)的值
func swap(num1: inout Int, num2: inout Int) {
let temp = num1
num1 = num2
num2 = temp
}
var number1 = 2
var number2 = 3
swap(num1: &number1, num2: &number2)
print(number1)
print(number2)
常用的內(nèi)置函數(shù)
Swift包含眾多的內(nèi)置函數(shù)弓颈,這里只介紹幾個常用的帽芽,
-
abs絕對值函數(shù)
print(abs(-1))
輸出結(jié)果為1
-
min最小值函數(shù)
print(min(3,4,1))
輸出結(jié)果為1
-
max最大值函數(shù)
print(max(2,5,3,1))
輸出結(jié)果為5
-
filter函數(shù)
filter
函數(shù)用于查找在數(shù)組元素中,滿足指定條件的元素翔冀,例如查數(shù)組中1~10能被3整除的數(shù)字导街。
let numbers = [1,2,3,4,5,6,7,8,9,10]
for i in numbers.filter({$0%3==0}) {
print(i)
}
$0
表示忽略了參數(shù)名,而使用默認參數(shù)為$0
輸出結(jié)果為:
3
6
9
-
map函數(shù)
map
函數(shù)通常用于將數(shù)組中的每個元素纤子,通過指定的方法進行轉(zhuǎn)換搬瑰。例如將數(shù)組中的每個整數(shù)都成3:
let numbers = [1,2,3,4,5,6,7,8,9,10]
for i in numbers.map({$0*3}) {
print(i)
}
輸出結(jié)果為:
3
6
9
12
15
18
21
24
27
30
-
reduce函數(shù)
reduce
函數(shù)可以把數(shù)組元素組合計算為一個值,比如將數(shù)組中每個數(shù)字進行加法計算控硼,獲得元素之和泽论。
let numbers = [1,2,3,4,5,6,7,8,9,10]
let sum = numbers.reduce(0, {$0+$1})
print(sum)
第一個參數(shù)為初始值,這里設(shè)置初始值為0了卡乾,就是將 0翼悴,1...到10依次相加。
也可以這樣寫
let sum2 = numbers.reduce(0, +)
print(sum2)
省略到上面的閉包幔妨。