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)"
})

 

posted @ 2016-11-23 17:05  Abnerzj  阅读(1274)  评论(0编辑  收藏  举报