加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift3.0通过闭包回调传递参数 / @escaping

发布时间:2020-12-14 06:32:34 所属栏目:百科 来源:网络整理
导读:// 加载请求数据func loadData (completion: @escaping (_ result:[String]) - ()) - () { DispatchQueue. global ().async { print ( "耗时操作 (Thread.current)" ) // 获取到的json结果数据 let json = [ "姓名" , "年龄" , "爱好" ] // 主队列回调 Disp
//加载请求数据
func loadData(completion: @escaping (_ result:[String]) -> ()) -> () {

    DispatchQueue.global().async {
         print("耗时操作 (Thread.current)")

     //获取到的json结果数据
     let json = ["姓名","年龄","爱好"]

     //主队列回调
     DispatchQueue.main.async {
          print("主线程更新 UI (Thread.current)")

           //回调异步获取的结果
           completion(json)
       }
    }
}
//调用:
//尾随闭包,//如果函数的最后一个参数是闭包,函数参数可以提前结束,最后一个参数直接使用{},包装闭包的代码
loadData { (result) in
    print("获取结果 (result)")
}

//按照函数本身的格式编写
loadData(completion: { (result) -> () in print("获取结果 (result)") })

注意到在loadData函数有通过智能提示出现了一个@escaping的关键词,@escaping(逃逸闭包):如果一个闭包被作为一个参数传递给一个函数,并且在函数return之后才被唤起执行,那么这个闭包是逃逸闭包.并且这个闭包的参数是可以“逃出”这个函数体外的.

在swift2中,可以标记一个函数参数@noescape属性,来告诉编译器传递给这个函数的闭包不允许“逃逸”出函数体外.但是在在swift3.0中,@noescape已经被移除了.引入了@escaping.

创建默认不可逃逸闭包的好处:最明显的好处就是编译器优化你的代码的性能和能力.如果编译器知道这个闭包是不可逃逸的,它可以关注内存管理的关键细节.

而且可以在不可逃逸闭包里放心的使用self关键字,因为这个闭包总是在函数return之前执行,你不需要去使用一个弱引用去引用self.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读