美文网首页iOS-swift小斑swift 文章收集
Swift笔记:闭包的常见使用场景

Swift笔记:闭包的常见使用场景

作者: Abnerzj | 来源:发表于2016-11-22 15:09 被阅读111次

    目前基于Swift 3.0+ 版本总结闭包的常见使用场景,后续不断更新维护,有遗漏错误之处欢迎小伙伴给我留言或发站内信。

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

    相关文章

      网友评论

        本文标题:Swift笔记:闭包的常见使用场景

        本文链接:https://www.haomeiwen.com/subject/awgppttx.html