函數(shù)
swift中函數(shù)與C語言中函數(shù)表現(xiàn)形式上沒有太大區(qū)別,同時(shí)內(nèi)外部參數(shù)的表現(xiàn)形式與OC邏輯相同,微小差異 : 元組概念為swift函數(shù)提供了多返回值的便捷使用方式
內(nèi)外參數(shù)分別聲明
func test(num1 num:Int) -> (Int) {
return num * 100 // 內(nèi)參數(shù)是num
}
var value = test(num1: 100) //調(diào)用時(shí)用外參數(shù)
普通函數(shù)表現(xiàn)形式---未標(biāo)注內(nèi)外參數(shù)時(shí)默認(rèn)相同
此種形式在原來版本需要在內(nèi)參數(shù)前加上# 表明內(nèi)外參數(shù)名相同
//定義一個(gè)函數(shù),注意參數(shù)和返回值,如果沒有返回值可以不寫返回值或者寫成Void、空元組()(注意Void的本質(zhì)就是空元組)
func sum(num1:Int,num2:Int)->Int{
return num1 + num2
}
let value = sum(num1: 23, num2: 42)//函數(shù)的調(diào)用
有默認(rèn)值的函數(shù)
func sum(num1:Int,num2:Int = 100)->Int{
return num1 + num2
}
let value = sum(num1: 23)
let value = sum(num1: 23, num2: 42)
可變參數(shù),一個(gè)函數(shù)最多有一個(gè)可變參數(shù)并且作為最后一個(gè)參數(shù)
下面strings參數(shù)在內(nèi)部是一個(gè)[String]
,對于外部是不定個(gè)數(shù)的String
參數(shù)
func joinStr(seperator:Character=",",strings:String...)->String{
var result:String=""
for var i=0;i<strings.count;++i{
if i != 0{
result.append(seperator)
}
result+=strings[i]
}
return result
}
joinStr(seperator:" ", "hello","world","!") //結(jié)果:"hello world !"
默認(rèn)內(nèi)參數(shù)為let類型,如果需要變化需要用var
func sum(num1:Int,num2:Int = 100)->Int{
var num1 = num1 //默認(rèn)內(nèi)參數(shù)為let類型,如果需要變化需要用var
num1 += 1
return num1 + num2
}
inout參數(shù) : 內(nèi)部可以改變外部參數(shù) (調(diào)用時(shí)候必須傳入變量)
func inoutTest(inout num1: Int) -> () { //swift3.0之前寫法
}
func inoutTest(num1:inout Int) -> () { //3.0以后寫法
}
作為參數(shù)和返回值
var sum3=sum //自動(dòng)推斷sum3的類型:(Int,Int)->Int,注意不同的函數(shù)類型之間不能直接賦值
sum3(1,2) //結(jié)果:3
//函數(shù)作為返回值
func fn()->(Int,Int)->Int{
//下面的函數(shù)是一個(gè)嵌套函數(shù),作用于是在fn函數(shù)內(nèi)部
func minus(a:Int,b:Int)->Int{
return a-b
}
return minus;
}
var minus=fn()
//函數(shù)作為參數(shù)
func caculate(num1:Int,num2:Int,fn:(Int,Int)->Int)->Int{
return fn(num1,num2)
}
caculate(1, 2, sum) //結(jié)果:3
caculate(1,2, minus) //結(jié)果:-1
閉包
- 全局函數(shù)和嵌套函數(shù)也是一種閉包,對于全局函數(shù)它不會(huì)捕獲任何常量或者變量,而對于嵌套函數(shù)則可以捕獲其所在函數(shù)的常量或者變量。
- 通常我們說的閉包更多的指的是閉包表達(dá)式,也就是沒有函數(shù)名稱的代碼塊,因此也稱為匿名閉包。
- 簡化使用形式稱之為
尾隨閉包
func caculate(num1:Int,num2:Int,fn:(Int,Int)->Int)->Int{
return fn(num1,num2)
}
caculate(a, b, {(num1:Int,num2:Int)->Int in
return num1 - num2
})
//常用以下方式來使用,稱之為`尾隨閉包`
//再次簡化,使用參數(shù)名縮寫,使用$0...$n代表第n個(gè)參數(shù),并且此in關(guān)鍵字也省略了
caculate(a, b, {
return $0 - $1
})