【Swift】关于闭包的几种写法

闭包

  • 闭包是可以在你的代码中被传递和引用的功能性独立代码块。

  • 闭包能够捕获和存储定义在其上下文中的任何常量和变量的引用,这也就是所谓的闭 合并包裹那些常量和变量,因此被称为“闭包”,Swift 能够为你处理所有关于捕获的内存管理的操作。

//  定义闭包
类型 : (形参) -> (返回值)

//  闭包执行回调
类型(值)

//  闭包实现回调
{
    (形参) -> (返回值) in
    //  执行代码
}

简单举个例子:在方法中定义闭包实现回调传值。

### WJKHttpTool.swift

import Foundation

class WJKHttpTool : NSObject {
     //  MARK:定义闭包
     func loadData(completion : (_ result : Bool) -> ()) -> () {
        //  MARK:闭包执行回调
        completion(true)
    }
}
### WJKViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let httpTool : WJKHttpTool = WJKHttpTool()
        
        //  MARK:闭包实现回调
         httpTool.loadData (completion: { (result) -> () in
             print(result)
        })
}

尾随闭包:

  1. 如果闭包是函数的最后一个参数,则可以将闭包写在 () 后面。
  2. 如果函数只有一个参数,并且这个参数是闭包,那么 () 可以不写。
上述闭包则为尾随闭包则可以写成
httpTool.loadData() { (result) -> () in
    print(result)
}

当然开发中建议(包括代码中敲回车代码补全)写成
httpTool.loadData { (result) -> () in
    print(result)
}

扩展
  • 如果闭包没有参数,没有返回值部分内容可以省略
如上述例子中没有返回值则可以写成
httpTool.loadData (completion: { (result) in
    print(result)
})

当然如果是尾随闭包则可以写成
httpTool.loadData { (result) in
    print(result)
}
//  所以上述写法就是最简写法(官方推荐写法)了
  • 解决循环引用
httpTool.loadData {[weak self] (result) in
    print(result)
    self?.view.backgroundColor = UIColor.white
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容