目前基于Swift 3.0+ 版本总结闭包的常见使用场景,后续不断更新维护,有遗漏错误之处欢迎小伙伴给我留言或发站内信。
常见使用场景:
1.作为变量
2.作为可选的变量
3.作为类型别名
4.作为常量
5.定义函数时作为函数的参数
6.调用函数时作为函数的参数:完整的闭包格式
7.调用函数时作为函数的参数:根据上下文推断类型
8.调用函数时作为函数的参数:单行表达式闭包隐式返回
9.调用函数时作为函数的参数:参数名称缩写
10.调用函数时作为函数的参数:尾随闭包(不是函数的唯一一个参数时)
11.调用函数时作为函数的参数:尾随闭包(是函数的唯一一个参数时)
12.调用函数时传入一个闭包函数作为函数的参数
13.调用函数时作为函数的参数:循环强引用
// 1.作为变量(类中的属性):
// var 闭包名称: (参数列表) -> 返回类型
var closureName1: (_ name: String, _ age: Int) -> String
// 2.作为可选的变量(类中的属性):
// var closureName: ((parameterTypes) -> returnType)?
var closureName2: ((_ name: String, _ age: Int) -> String)?
// 3.作为类型别名(闭包类型):
// typealias closureType = (parameterTypes) -> returnType
typealias closureType = (_ name: String, _ age: Int) -> String
// 4.作为常量(类中的属性):
// let closureName: closureType = 闭包表达式
let closureName3: closureType = { (_ name: String, _ age: Int) -> String in
return "My name is \(name), age is \(age)"
}
closureName3("Abnerzj", 10)
// 5.定义函数时作为函数的参数:
// 5.1 func 函数名(参数名: 闭包类型)
func closureFuncName(closureParameterName: closureType) -> Void {
// 函数体部分
}
// 5.2 func 函数名(参数名: 闭包表达式)
func closureFuncName2(closureParameterName: (_ name: String, _ age: Int) -> String) -> Void {
// 函数体部分
}
// 6.调用函数时作为函数的参数:完整的闭包格式
// 函数名(参数名: 闭包表达式)
// 函数名(参数名: { 闭包参数列表 -> 闭包返回值 in 闭包函数体 })
closureFuncName(closureParameterName: {
(_ name: String, _ age: Int) -> String in
return "My name is" + name + ", age is \(age)"
})
// 7.调用函数时作为函数的参数:根据上下文推断类型:
// 函数名(参数名: { 实参名1, 实参名2 in 闭包函数体 })
closureFuncName(closureParameterName: {
name, age in
return "My name is" + name + ", age is \(age)"
})
// 8.调用函数时作为函数的参数:单行表达式闭包隐式返回,可以隐藏return关键字
// 函数名(参数名: { 实参名1, 实参名2 in 闭包函数体 })
closureFuncName(closureParameterName: {
name, age in "My name is" + name + ", age is \(age)"
})
// 9.调用函数时作为函数的参数:参数名称缩写($0,$1,$2...来顺序代替参数列表中的参数名)
// 函数名(参数名: { 闭包函数体 })
closureFuncName(closureParameterName: {
"My name is \($0), age is \($1)"
})
// 10.调用函数时作为函数的参数:尾随闭包(作为函数的最后一个参数),不是函数的唯一一个参数时
// 函数名() { 闭包函数体 }
closureFuncName() {
"My name is \($0), age is \($1)"
}
// 11.调用函数时作为函数的参数:尾随闭包(作为函数的最后一个参数),是函数的唯一一个参数时
// 函数名 { 闭包函数体 }
closureFuncName {
"My name is \($0), age is \($1)"
}
// 12.调用函数时传入一个闭包函数作为函数的参数
// 函数名(参数名: 闭包函数名)
func closureFunc(_ name: String, _ age: Int) -> String {
return name + "\(age)"
}
closureFuncName(closureParameterName: closureFunc)
// 13.调用函数时作为函数的参数:循环强引用
// 函数名(参数名: { [弱引用或无主引用列表] 闭包参数列表 -> 闭包返回值 in 闭包函数体 })
// 第一种:推荐
closureFuncName(closureParameterName: {
[weak self] (_ name: String, _ age: Int) -> String in
self?.view.backgroundColor = UIColor.red
return "My name is" + name + ", age is \(age)"
})
// 第二种:
weak var weakself = self
closureFuncName(closureParameterName: {
(_ name: String, _ age: Int) -> String in
weakself?.view.backgroundColor = UIColor.red
return "My name is" + name + ", age is \(age)"
})
// 第三种:
closureFuncName(closureParameterName: {
[unower self] (_ name: String, _ age: Int) -> String in
self?.view.backgroundColor = UIColor.red
return "My name is" + name + ", age is \(age)"
})
网友评论