??目前在做的項(xiàng)目要求用swift來寫,所以現(xiàn)在正處于邊做項(xiàng)目邊學(xué)習(xí)的過程,但有oc的開發(fā)經(jīng)驗(yàn),swift就非常容易上手了.今天就記錄一下我學(xué)習(xí)Swift閉包的使用.
閉包:
??閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),可以理解成定義在一個(gè)函數(shù)內(nèi)部的函數(shù).
??簡(jiǎn)單的說它就是一個(gè)代碼塊,用{}包起來,他可以用在其他函數(shù)的內(nèi)部,將其他函數(shù)的變量作為代碼塊的參數(shù)傳入代碼塊中.在Swift中多用于回調(diào).
一般形式
- 例子
//一般形式
//有參有反
let testOne: (String, String) -> String = {(str1, str2) in return str1 + str2}
print(testOne("one", "two"))
//無參有反 可以直接省略 "in"
let testTwo: () -> String = {return "test閉包"}
//無參無反
let testThree: () -> Void = {print("test閉包")}
歸納
上面的例子中":"后面是閉包的類型,而"="后面的就是一個(gè)代碼塊,也就是閉包的具體實(shí)現(xiàn).這些跟oc中的block基本一樣.起別名
//可以用"typealias"先聲明一個(gè)閉包類型
typealias testBlock = (String) -> Void
let aaa: testBlock = {str in
print(str)
}
值捕獲
- 簡(jiǎn)單來說就是閉包可以捕獲上下文中的常量和變量,常常是外部函數(shù)中的變量和常量
直接上例子
//現(xiàn)在寫一個(gè)方法,將一個(gè)閉包嵌套在函數(shù)內(nèi)部,來證明閉包可以捕獲外部函數(shù)的變量和常量,同時(shí)也能讓大家思考另一個(gè)知識(shí).
typealias intBlock = () -> Int
func catchValue(number: Int) -> intBlock {
var totalValue = 0
let testBlock: intBlock = {
totalValue += number
return totalValue
}
return testBlock
}
let bbb = catchValue(number: 20)
print(bbb()) //20
print(bbb()) //40
print(bbb()) //60
//可以看到這里成功的捕獲到函數(shù)中的變量的值,每一次調(diào)用都會(huì)累加數(shù)值
print(catchValue(number: 20)()) //20
print(catchValue(number: 20)()) //20
print(catchValue(number: 20)()) //20
//這里的值沒有發(fā)生改變,是因?yàn)楹瘮?shù)被調(diào)用結(jié)束就被釋放了,沒有用一個(gè)常量或變量去引用他,相當(dāng)于每次調(diào)用都是一個(gè)新的函數(shù),與OC中的匿名對(duì)象概念是相同的
由此也能看出閉包是引用類型
逃逸閉包
概念
當(dāng)一個(gè)閉包作為參數(shù)傳入函數(shù)中,這個(gè)閉包需要等函數(shù)執(zhí)行結(jié)束返回后在執(zhí)行,這種情況就稱作閉包在這個(gè)函數(shù)中逃逸.
這種情況,在涉及到異步操作時(shí)經(jīng)常用到,特別是當(dāng)網(wǎng)絡(luò)請(qǐng)求后要進(jìn)行請(qǐng)求成功后的回調(diào)時(shí),閉包就要逃逸掉.這時(shí)就要在閉包形參前加上"@escaping"關(guān)鍵字上例子
func showYouTest(testBlock: @escaping () -> Void) {
//做一個(gè)延遲操作
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5) {
//五秒之后調(diào)用閉包
testBlock()
}
print("我是函數(shù)")
}
showYouTest {
print("我是閉包")
}
??OK這是我在swift中對(duì)閉包的一些理解,也是在網(wǎng)上找資料,自己理解總結(jié)的,這里寫下來,給自己當(dāng)做筆記,也是學(xué)習(xí)的鑒證吧.