(一)什么是閉包?
閉包和函數(shù)一個(gè)概念,是一致的,之外還有自己的特性.
arr.sort() //傳一個(gè)閉包和傳一個(gè)函數(shù) 是一個(gè)結(jié)果. 看如下代碼:
準(zhǔn)備一個(gè)數(shù)組:
var arr:[Int] = []
for _ in 0...10{
arr.append(random()%1000)
}
傳一個(gè)函數(shù)例子:
先定義一個(gè)函數(shù)
func biggerNumberFirst(a:Int,_ b:Int)->Bool{
return a > b
}
調(diào)用函數(shù)
var newArray = arr.sort(biggerNumberFirst)
傳一個(gè)閉包:
arr.sort({
(a:Int,b:Int)->Bool in
return a>b
})
(二)閉包的簡(jiǎn)寫(xiě)方式
還有幾種簡(jiǎn)寫(xiě)方式:
一種:由于在sort方法的聲明中,函數(shù)的參數(shù)類型和返回值類型都已經(jīng)被定義了.
arr.sort({a,b in return a>b})
一種:由于sort方法中已經(jīng)規(guī)定了必須有返回值,而且我們的返回只有一行代碼,就可以寫(xiě)成下面這種形式
arr.sort({a,b in a>b})
一種使用swift提供的默認(rèn)變量形式
arr.sort({$0>$1})
還有一種是:在swift中,><號(hào) 就是一種函數(shù)
arr.sort(>)
當(dāng)閉包是這個(gè)方法的最后一個(gè)參數(shù):可以簡(jiǎn)寫(xiě)成
var newarr = arr.sort (){ (a, b) -> Bool in
return a>b
}
當(dāng)閉包是這個(gè)方法的最后一個(gè)參數(shù),且只有一個(gè)閉包參數(shù)的時(shí)候:函數(shù)名后面的小括號(hào)也可以省略,可以簡(jiǎn)寫(xiě)成
var newarr = arr.sort{ (a, b) -> Bool in
return a>b
}
(三)閉包的特性---內(nèi)容捕獲
var num = 700
arr.sort {
a, b in
abs(a-num) < abs(b-num)
}
基本數(shù)據(jù)類型,在閉包中的內(nèi)存問(wèn)題,不會(huì)有什么問(wèn)題.
(四)閉包和函數(shù)是引用類型.
定義一個(gè)返回函數(shù)的一個(gè)函數(shù).
func runningMetersWithMetersPerDay(metersPerDay:Int) -> ()->Int {
var totalMeters = 0
return {
totalMeters += metersPerDay
return totalMeters
}
}
var planA = runningMetersWithMetersPerDay(100)
planA() //100
planA() //200
var anoterPlan = planA //在這里將函數(shù)賦值給了另外一個(gè)變量 從下面結(jié)果看,其實(shí)也就是給變量起了另外一個(gè)名字.anoterPlan.不管調(diào)用哪個(gè),都是后面指定的內(nèi)存起作用.
anoterPlan() //300
planA() //400