//闭包
/*闭包格式
{(参数名: 参数类型) in
闭包主体
}
*/
let 闭包 = { (name: String) in
print("我女朋友的名字叫:\(name)")
}
闭包("小李")
//注意闭包和函数的区别,闭包不能加外部参数名
/*带有返回值的闭包
{(参数名: 参数类型) -> (返回值类型) in
闭包主体
}
*/
let 闭包1 = { (age: Int) -> (String) in
guard age > 18 && age < 25 else{
return "不符合我的择偶标准"
}
return "做我女朋友好吗"
}
print(闭包1(20))
print(闭包1(30))
//将闭包作为参数.闭包可以像字符串和整型那样使用,所以可以作为参数使用
//注意:闭包其实是一种特殊的匿名函数
//从闭包是一种匿名函数也可以理解这些用法
let goSchool = { () -> () in
print("去学习")
}
func goWork(){
print("去上班吧孩子")
}
//参数类型 () -> () 一个无参无返回类型.只要符合这个类型的都可以进行传值.可知,函数和闭包都符合
func manDoThings(name: () -> ()){
print("此处打印")
name() //此处调用传入这个类型的函数或者闭包.可以把闭包作为匿名函数去调用
}
//调用函数时系统会提示有两种调用方法
//尾随闭包的调用方式.其实方法名后面省去了()
manDoThings {
// 闭包主体部分.在这里传参
// goSchool()
goWork()
}
//此处闭包作为普通参数.闭包和函数的用法相同
manDoThings(name: goWork)
manDoThings(name: goSchool)
//有参数闭包
let goStreet = { (name: String) -> () in
print("\(name)去哪了?")
}
func todayTodo(aname: (String) -> ()){
aname("小明")
}
//有参有返回闭包
todayTodo { (heeh: String) in
goStreet(heeh)
}
let bibao1 = { (str: String) -> String in
return "\(str)的年龄是18"
}
func funcThings1(name: (String) -> String) -> String{
let cc = name("刘燕")
return cc
}
//aStr后面的类型可以不写,因为swift会自己推断出是String类型.其实闭包里还省略了return
let dd = funcThings1 { (aStr) -> String in
bibao1(aStr)
//return bibao1(aStr)
}
print(dd)
//返回是闭包
func funcThing2(name: String) -> (Int) -> (String){
func abc(age: Int) -> String {
if age < 8 {
return "\(name)正在上学前班"
}else{
return "\(name)正在上小学"
}
}
return abc(age:)
}
//定义一个常量接受返回类型.这里返回类型是一个闭包(函数)
let bibao22 = funcThing2(name: "小豆")
//去调用
let ee = bibao22(10)
print(ee)
//闭包还可以捕获外部的值
//此处省略
网友评论