IOS swift3.0 下闭包语法整理

2020-01-18 17:33:04王振洲

CustomView类中代码


class CustomView: UIView {

  //声明一个属性btnClickBlock,type为闭包可选类型
  //闭包类型:()->() ,无参数,无返回值
  var btnClickBlock:(()->())?;

  //重写 init(frame: CGRect)构造函数
  override init(frame: CGRect) {
    super.init(frame:frame);
    //创建按钮
    let btn = UIButton(frame: CGRect(x: 15, y: 15, width: 80, height: 32));
    btn.setTitle("按钮", for: .normal);
    btn.backgroundColor = UIColor.blue;
    //绑定事件
    btn.addTarget(self, action: #selector(CustomView.btnClick), for: .touchDown);
    //添加
    addSubview(btn);

  }
  //按钮点击事件函数
  func btnClick(){

    if self.btnClickBlock != nil {
      //点击按钮执行闭包
      //注意:属性btnClickBlock是可选类型,需要先解包
      self.btnClickBlock!();
    }
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

}

Controller类中代码:


class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    //创建CustomView对象
    let cutomeView = CustomView(frame: CGRect(x: 50, y: 50, width: 200, height: 200));
    //给cutomeView的btnClickBlock闭包属性赋值
    cutomeView.btnClickBlock = {
      // () in 无参数可以省略
      //当按钮被点击时会执行此代码块
      print("按钮被点击");
    }
    cutomeView.backgroundColor = UIColor.yellow;
    //添加到控制器view上
    self.view.addSubview(cutomeView);

  }
}

2、异步回调(callBack)

以发送一个简单的网络请求为例:


/// 定义一个网络请求函数
  ///
  /// - parameter urlString: 请求接口  String
  /// - parameter succeed:  成功的回调 可选闭包
  /// - parameter failure:  失败的回调 可选闭包
  func requestData(urlString:String,succeed: ((Any?)->(Void))?,failure:((Any?)->(Void))?){

    let request = URLRequest(url: URL(string: urlString)!);

    //发送网络请求
    NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue()) { (_, data, error) in
      if error == nil {
        //请求成功,执行成功的回调,并把数据传递出去
        succeed?(data);
      }else{
         //请求失败,执行失败的回调,并把错误传递出去
        failure?(error);
      }
    }
  }


// 调用函数requestData函数
    requestData(urlString: "http://www.easck.com//成功的回调
      guard let result = data as? Data else{
        return;
      }

      let srt = NSString(data: result, encoding: String.Encoding.utf8.rawValue);

      print(srt!)


      }) { (error) -> (Void) in
        //失败的的回调
        print(error);
    }

四、闭包的一些特殊语法

1、尾随闭包

当闭包作为函数的最后一个参数时,可以省略前面的括号。尾随闭包没什么特殊的作用,纯粹是一种语法上的简洁,增加易读性。