Closure in Swift

Block很像,表示代码的集合,简称代码块。

可以被传递,不会马上被执行,当然后期可以被执行多次。

NSURLSessioncompletionHandler就是一个closure对象,这个对象会在NSURLSession收到了服务器的返回数据或者错误信息之后被执行。

一般closure有下面两种:

{ parameters in
  //Code
}

或者没有参数的版本:

{
  //Code
}

第一种中,in关键字分割了参数,就像函数和方法那样,closure可以接收参数,在in关键字之前,而且不需要指明参数类型,如果想要指明参数类型也可以:

下面是指明了closure的参数类型的声明方法:

let dataTask = session.dataTaskWithURL(url, completionHandler: {
  (data: NSData?, response: NSURLResponse?, error: NSError?) in
  ...
})

closure代码中,可以使用 $0 $1 $2 来代替参数。

如果调用的方法的最后一个参数是一个closure,那么可以对掉用进行简写:

let dataTask = session.dataTaskWithURL(url) {
  data, response, error in
  ...
}

不简写的版本是:

let dataTask = session.dataTaskWithURL(url, completionHandler:{
  data, response, error in
  ...
})

简写的版本更加易读。

closure也可以用作 初始化对象 和lazy loading

lazy var dateFormatter: NSDateFormatter = {
  let formatter = NSDateFormatter()
  formatter.dateStyle = .MediumStyle
  formatter.timeStyle = .ShortStyle
  return formatter
}()

Swift中所有的 方法 都是closure,可以直接将一个已有的方法当做closure在参数中进行传递,只要 参数列表是匹配的。

let dataTask = session.dataTaskWithURL(url,
    completionHandler: myCompletionHandlerMethod)
func myCompletionHandlerMethod(data: NSData?,
    response: NSURLResponse?, error: NSError?) {
   ...
}

closure会捕获所有在内部使用的变量,包括self,会有几率造成引用循环和内存泄露,解决方法:

let dataTask = session.dataTaskWithURL(url) {
  [weak self] data, response, error in
  ...
}

最后:Swift支持一种no escapeclosure,后续再补充:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子阅读 8,788评论 0 36
  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,461评论 1 5
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,926评论 1 10
  • 即使寒风吹弯了我的身躯 我也要傲然挺立 属于我的劫难 我唯有自渡
    广意_阅读 211评论 0 5
  • 好多年的记忆,妈妈在天堂;好多年的想念,妈妈在天堂;好多年的挂心,好妈在天堂。天堂也许很快乐,听不到你的哭泣。天堂...
    buguxinyousanba阅读 433评论 0 0