下面是一個(gè)基本的閉包:
var multiplyClosure = { (a: Int, b: Int) -> Int in
return a * b
}
這就是一個(gè)基本的閉包類(lèi)型,其基本格式為{ (參數(shù)列表)-> 返回值 in 函數(shù)體}
對(duì)上面這個(gè)閉包,可以進(jìn)行如下的精減
1、去掉return
var multiplyClosure = { (a: Int, b: Int) -> Int in
a * b
}
2、去掉返回值類(lèi)型,讓系統(tǒng)自己推斷
var multiplyClosure = { (a: Int, b: Int) in
a * b
}
3、將參數(shù)中的類(lèi)型聲明去掉,這種情況要實(shí)現(xiàn)聲明變量的類(lèi)型為閉包
var multiplyClosure: (Int,Int) -> Int
multiplyClosure = { (a, b) in
a * b
}
4、最后還可以將參數(shù)列表去掉,根據(jù)參數(shù)出現(xiàn)的位置來(lái)處理
var multiplyClosure: (Int,Int) -> Int
multiplyClosure = {
$0 * $1
}
聲明一個(gè)沒(méi)有參數(shù)和返回值的閉包
let voidClosure: () -> Void = {
print("Swift is awesome")
}
voidClosure()
下面這個(gè)是閉包作為返回值的一個(gè)例子
func countingClosure() -> (() -> Int) {
print("ok")
var counter = 0
let incrementCounter: () -> Int = {
print(counter)
counter += 1
print(counter)
return counter
}
return incrementCounter
}
let counter1 = countingClosure()
let counter2 = countingClosure()
//counter1時(shí)一個(gè)閉包,閉包作為函數(shù)執(zhí)行,返回int類(lèi)型的值
counter1()
counter1()
counter2()
一個(gè)例子:
func mathSum(times: Int, operation: (Int) -> Int) -> Int {
var result = 0
for i in 1...times {
result += operation(i)
}
return result
}
var result1 = mathSum(10, operation: {(a: Int) -> Int in return a * a })
print(result1)
var result2 = mathSum(10, operation: {(a: Int) -> Int in fibonacci(a)})
print(result2)