閉包

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

(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ì)

逃逸閉包

閉包使用場(chǎng)景

需要加@escaping關(guān)鍵字的閉包逃逸場(chǎng)景
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本章將會(huì)介紹 閉包表達(dá)式尾隨閉包值捕獲閉包是引用類型逃逸閉包自動(dòng)閉包枚舉語法使用Switch語句匹配枚舉值關(guān)聯(lián)值原...
    寒橋閱讀 1,629評(píng)論 0 3
  • 閉包 閉包是自包含的功能塊,可以在代碼中傳遞和使用。Swift中的閉包與C和Objective-C中的塊以及其他編...
    Fuuqiu閱讀 440評(píng)論 0 0
  • 閉包是功能性自包含模塊,可以在代碼中被傳遞和使用。Swift中的閉包與 C 和 Objective-C中的 blo...
    AirZilong閱讀 386評(píng)論 0 2
  • 17前夫的婚貼 周五上午,徐毅涵坐在辦公桌前,神情落寞,心不在焉。以至于牛凡一喊了她幾次,她都沒有反應(yīng)。她那郁郁寡...
    奇奇漫悅讀閱讀 791評(píng)論 2 4

友情鏈接更多精彩內(nèi)容