Swift中的闭包学习

 由于在过去的OC项目中总是使用block,所以一旦使用swift写项目的时候总是避免不了回念Block,为了能够快速的搭建项目,加紧学习了一下闭包。

为了项目的使用,我直接根据功能区学习闭包,我需要的是OC中那种存放在函数中的,如加载数据一样的,可以定义的,调用后有返回值的,大体看了一下闭包的概念,我需要是逃逸闭包

首先如我们在OC中一般,对block起个别名,以便好调用,定义一个按钮点击传tag的闭包

typealias ClickHandler= (_selectTag:Int)->Void

在该类中,再次定义一个属性,以便于在其他方法中调用

var clickHandler:ClickHandler!

定义一个方法,用于子类调用,传入闭包,在这里使用到了逃逸闭包

 func showAlertViewWithType(showType:ShowAlertType,clickHandler:@escaping ClickHandler){

        showAlert()

        self.clickHandler= clickHandler

    }

生成子类调用方法

showAlertView.showAlertViewWithType(showType: .defaulted) { (selectTag)in

            print("点击的按钮tag\(selectTag)"

        }

调用类中的逃逸闭包,就可以看到点击的selectTag

showAlertView.clickHandler(12)

这便是我们一般开发项目中使用到的block样式的逃逸闭包

接下来真正的认识一下swift中的闭包

闭包表达是一个轻量级语法所写的可以捕获上下文中常量和变量值的没有名字的闭包。(和block一个样,捕获值的特性)

{(parameters) —>(returnType) in 

statements

}

非逃逸闭包

非逃逸闭包的生命周期:

(1)把闭包作为参数传递给函数。

(2)函数中运行该闭包。

(3)退出函数。

非逃逸闭包被限制在函数内,当函数退出时,该闭包的引用计数不会增加,也就是说其引用计数在进入函数和退出函数时保持不变。

逃逸闭包

当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,我们称该闭包从函数中逃逸。

逃逸闭包生命周期长于相关函数,当函数退出时,逃逸闭包的引用仍然被其他对象持有,不会再相关函数结束后释放。

闭包参数默认是非逃逸类型。如果需要其逃逸类型的闭包,可以使用关键字@escaping

逃逸闭包使用场景

异步调用:如果需要调度队列中异步调用闭包,这个队列会持有闭包的引用,至于什么时候调用闭包,或者闭包什么时候运行结束都是不可预知的。

存储:需要存储闭包作为属性,全局变量或者其他类型做稍后使用。