Swift @autoclosure关键字的用法及场景

@autoclosure及自动封装成闭包我们先模拟一个场景 创建一个数组 我们先判断数组是否为空,再去判断他下标为0的元素是否为0显然这段场景需要先执行第一步才能再执行第二步 否则数组会出现越界我们使用下面代码let num = [Int]()//这里第一个条件判断出有问题就不会执行第二个操作了 这样就不会越界了if !num.isEmpty && num[0]>...
摘要由CSDN通过智能技术生成

@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 (_ 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值