Swift笔记:闭包的常见使用场景
目前基于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)" })