闭包有点像c++里面的表达式匿名函数之类的
1.字包含功能的代码块
类型
2.可以优化的地方
- 根据上下文推断参数和返回值类型
- 从单行表达式中隐式返回(闭包只有一行代码,可以省略return)
- 可以实用简化参数名,如$0,$1(从0开始,表示第i 个参数)
- 尾随闭包语法
3.闭包语法
(1) 接收参数并返回制定类型的闭包语法
{(parameters)->return type in
statements
}
//匿名函数
import Cocoa
let studname={print("swift 闭包")}
studname()//swift 闭包
(2) 闭包形式接收两个参数并返回布尔值
{(int,int)->bool in
statement1
statement2
…
}
import Cocoa
let devide={(val1:int,val2:int)->int in
return val1/val2
}
let result=devide(200,20)
print(result)//10
4.闭包表达式
格式
1.
func fun(a:type)->void{
//函数主题
}
2.
fun({
//闭包主体
})
3.fun(){
//闭包主体
}
之前
sorted(by:)
import Cocoa
let names=["AT","AE","D","S","BE"]
func backwards(s1:string,s2:string)->bool{
return s1>s2
}
var reversed=names.sorted(by:backwaeds)//c++一致
print(reversed)//["S","D","BE","AT","AE"]
之后
import Cocoa
let names=["AT","AE","D","S","BE"]
var reversed=names.sorted(by:{$0>$1})//$0 $1 $2调用闭包的参数
//var reversed=names.sorted(by:>})
print(reversed)
再后尾随闭包
import Cocoa
let names=["AT","AE","D","S","BE"]
var reversed=names.sorted(){$0>$1}//$0 $1 $2调用闭包的参数
print(reversed)
5.捕获值
闭包可以再其定义的上下文中捕获常量或变量
嵌套函数也可以(之前遇到过)
即使定义这些常量和变量的原域已经不存在
捕获了a和total,会在闭包内部存续,多次调用计数器会增加
把闭包赋给了两个常量/变量,两个值指向的都是一个闭包
import Cocoa
func cal(out_t total: Int) -> () -> Int {
var a= 0
func decrementer() -> Int {
a+= total
return a
}
return decrementer
}
let decrem = cal(out_t: 30)
print(decrem())//30
print(decrem())//60
print(decrem())//90
let alsedecrem=cal(out_t:30)
print(alsedecrem())//120