@autoclosure及自动封装成闭包
我们先模拟一个场景 创建一个数组 我们先判断数组是否为空,再去判断他下标为0的元素是否为0
显然这段场景需要先执行第一步才能再执行第二步 否则数组会出现越界
我们使用下面代码
let num = [Int]()
//这里第一个条件判断出有问题就不会执行第二个操作了 这样就不会越界了
if !num.isEmpty && num[0]>0{
}
这里是没有问题的
现在我们想设置一个函数 ,来代替&&的操作
func judgeTwice ( a : Bool , b : @autoclosure ()-> Bool) -> Bool{
func judgeTwice (_ a : Bool ,_ b :Bool) -> Bool{
print("judgeTwice start working")
guard a else {
return false
}
return b
}
if judgeTwice(!num.isEmpty,num[0]>0) {
}
这里就报错了 原因是num[0]>0在执行第一个!num.isEmpty参数的情况下就被执行了,控制台也没有打印消息,说明这个函数并没有被调用就已经崩溃了 。
我们可以得出结论函数使用的时候系统先去会编译一次函数的参数,去看其是否越界之类。
如果想要参数在函数中再去执行,我们就可以使用闭包的方法,把条件封装起来,不然系统检查到越界,因为我们在函数中可以保证使用的时候不会出现越界问题。
我们修改一下上面代码
func judgeTwice (_