閉包:自包含的代碼塊,可以在代碼中被傳遞和使用

(s1:String, s2:String) -> Bool in return s1<s2 } //閉包
閉包的三種形式

閉包表達(dá)式語法

閉包簡(jiǎn)化寫法

let names=["Zhao","Sun","Qian","D"]
func comparator(s1:String,s2:String) ->Bool{
return s1<s2
}
//對(duì)字符串按照大小進(jìn)行排序
var sortedNames=names.sorted{$0<$1}
print(sortedNames)
var newNames=names.sorted(by: comparator)
newNames=names.sorted(by: { (s1:String,s2:String) ->Bool in return s1<s2 })
newNames=names.sorted(by: {s1,s2 in return s1<s2})
newNames=names.sorted(by: {s1,s2 in s1<s2})
newNames=names.sorted(by: {$0<$1})
newNames=names.sorted(){$0<$1}
newNames=names.sorted {$0<$1}
newNames=names.sorted (by: <)
簡(jiǎn)略寫法2
/**
* 函數(shù)簡(jiǎn)略寫法
*/
func calculate(a:Int,b:Int,mathFunction:(Int,Int)->Int)->Int{
return mathFunction(a,b)
}
func addTwoInts(a:Int,b:Int)->Int{
return a+b
}
var door=calculate(a: 3, b: 5, mathFunction: {(a:Int,b:Int)->Int in return a+b})//一行代碼 將addTwoInts閉包放到這個(gè)函數(shù)內(nèi)
door=calculate(a: 3, b: 5, mathFunction: {a,b in return a+b})//根據(jù)上下文推斷類型
door=calculate(a: 3, b: 5, mathFunction: {a,b in a+b}) //但表達(dá)式閉包隱式返回
door=calculate(a: 3, b: 5, mathFunction: {$0+$1})//參數(shù)名稱縮寫
door=calculate(a: 3, b: 5) {$0+$1} //尾隨閉包方式
//添加新的方法
door=calculate(a: 3, b: 5) {$0*$1}//乘法
door=calculate(a: 3, b: 5) {$0*$0*$1} //第一個(gè)參數(shù)乘兩次再乘第二個(gè)參數(shù)

高階函數(shù)
- 接收一個(gè)或多個(gè)函數(shù)作參數(shù)
- 或者把一個(gè)函數(shù)當(dāng)做返回值
- map
- reduce
- filter
map
/**
* 高階函數(shù)
*/
//1.map 用來對(duì)數(shù)組元素進(jìn)行某種規(guī)則的轉(zhuǎn)換
let numbers = [1,2,3,4]
//需求:1.將numbers數(shù)組里的值全變成第..個(gè) 2.將數(shù)組值變成11,12,13,14
//解決方案:map
//1.完整寫法
let numbersName=numbers.map { (element:Int) -> String in
return "第"+String(element)+"個(gè)"
}
print(numbersName)//["第1個(gè)", "第2個(gè)", "第3個(gè)", "第4個(gè)"]
//1.簡(jiǎn)略寫法
let numbersName1=numbers.map{"第"+String($0)+"個(gè)"}//尾隨閉包+參數(shù)名縮寫
print(numbersName1)//["第1個(gè)", "第2個(gè)", "第3個(gè)", "第4個(gè)"]
//2.完整寫法
let newNubers = numbers.map { (element:Int) -> Int in
return element+10
}
print(newNubers)//[11, 12, 13, 14]
//2.簡(jiǎn)略寫法
let newNumbers=numbers.map{$0+10}
print(newNumbers)//[11, 12, 13, 14]
reduce:對(duì)數(shù)組元素進(jìn)行某種規(guī)則的歸納
/**
* 高階函數(shù)
*/
//reduce
//1.累加 2.累乘
let numbers=[1,2,3,4]
//1.完整寫法需要設(shè)置初始值這里加法所以設(shè)置0 期望結(jié)果:1+2+3+4=10 這里設(shè)置成0實(shí)際結(jié)果是0+1+2+3+4=10
var reduceResult=numbers.reduce(0){(prevSum:Int, element:Int) in prevSum+element}
//$0指之前的歸納值 1.簡(jiǎn)略寫法
reduceResult=numbers.reduce(0){$0+$1}//10
print(reduceResult)
//2.完整寫法,這里設(shè)置成1,實(shí)際運(yùn)算是1*1*2*3*4=24
reduceResult=numbers.reduce(1){(prevSum:Int, element:Int) in prevSum*element}
//2.簡(jiǎn)略寫法
reduceResult=numbers.reduce(1){$0*$1}
print(reduceResult)//24
filter:對(duì)數(shù)組元素進(jìn)行某種規(guī)則的過濾
/**
* 高階函數(shù)
*/
//需求:過濾出其中的偶數(shù)
let numbers=[1,2,3,4,44,55,66,789,1123,2018]
//符合偶數(shù)的數(shù)提取出來存入evens
var evens=numbers.filter{(element:Int) in return (element%2==0)}
evens=numbers.filter{element in element%2==0}
evens=numbers.filter{$0%2==0}
print(evens)//[2, 4, 44, 66, 2018]
//符合偶數(shù)的數(shù)提取出來存入evens
evens=numbers.filter{(element:Int) in return (element%2==1)}
evens=numbers.filter{$0%2==1}
print(evens)//[1, 3, 55, 789, 1123]
捕獲值(capturing values)

嵌套函數(shù)可以隨時(shí)獲取amount,runingTotal和incrementor函數(shù)的值
//嵌套函數(shù)
func makeIncrementor(forIncrement amount:Int)->() ->Int{
var runningTotal = 0
func incrementor() ->Int {
runningTotal += amount
return runningTotal
}
return incrementor
}
let incrementByTen=makeIncrementor(forIncrement: 10)
print(incrementByTen())//10
//將這個(gè)incrementByTen這個(gè)函數(shù)賦值給anotherIncrementByTen,調(diào)用anotherIncrementByTen會(huì)在incrementByTen的值為10的基礎(chǔ)上進(jìn)行繼續(xù)計(jì)算
let anotherIncrementByTen=incrementByTen
print(anotherIncrementByTen())//20
//如果直接調(diào)用makeIncrementor這個(gè)函數(shù)值會(huì)重新開始計(jì)算
let therdIncrementByTen=makeIncrementor(forIncrement: 10)
print(therdIncrementByTen())//10
這里incrementByTen調(diào)用完閉包之后,another...ByTen調(diào)用這個(gè)閉包,因?yàn)檫@個(gè)閉包是引用類型,多以他們指向了同一個(gè)地址, 閉包維護(hù)了內(nèi)部的函數(shù)和自由變量,第二個(gè)函數(shù)調(diào)用會(huì)在原來的基礎(chǔ)上進(jìn)行累計(jì)

這里incrementByTen調(diào)用完閉包之后,another...ByTen調(diào)用這個(gè)閉包,因?yàn)檫@個(gè)閉包是引用類型,多以他們指向了同一個(gè)地址, 閉包維護(hù)了內(nèi)部的函數(shù)和自由變量,第二個(gè)函數(shù)調(diào)用會(huì)在原來的基礎(chǔ)上進(jìn)行累計(jì)
逃逸閉包

閉包使用場(chǎng)景

需要加@escaping關(guān)鍵字的閉包逃逸場(chǎng)景
