闭包写法
let fun1 = {
(num:Int)->Int in
return num*num
}
print(type(of:fun1))//fun1类型:(Int) -> Int
print(fun1(4))
闭包表达式语法
1、由一对{}开始和结束;
2、in关键字把闭包分成两部分:参数与返回值、闭包体
闭包缩写
func getScore(score:[Int],con:(Int)->Bool)->[Int]{
var newScore = [Int]()
for item in score{
if con(item){
newScore.append(item)
}
}
return newScore
}
var score = [1,2,3,4,5]
print(getScore(score:score,con:{(s:Int)->Bool in return s>0}))
其他缩写:
print(getScore(score:score,con:{(s:Int) in return s>0}))
省略->返回类型
print(getScore(score:score,con:{s in return s>0}))
省略参数类型和括号
print(getScore(score:score,con:{s in s>0}))
单行表达式闭包可以省略 return 关键字来
print(getScore(score:score,con:{$0>0}))
省略参数列表定义,用1等等指代参数
尾随闭包
func printInfo(info:String,printFun:(String)->Void){
printFun(info)
}
//普通调用方式
printInfo(info:"hello world",printFun:{s in print(s+"~~~")})
//使用尾随闭包进行调用
printInfo(info:"hello world"){s in print(s+"~~~")}
逃逸闭包
var recv:()->Void = {print("")}
var x = 10
func test1(closure:()->Void){
recv = closure无法在函数外使用。
}
test1{
x=100
}
recv()
func test2(closure:@escaping ()->Void){
recv = closure
}
test2{
x = 200
}
recv()
print(x)