Swift 闭包与@autoclosure

21 篇文章 0 订阅
14 篇文章 0 订阅

有写过OC的同学一定知道OC中又个Block的概念,其实Swift中有一个也有与之对应的闭包概念,说到闭包不得不说@autoclosure关键字,其实就是自动闭包的意思。
先来看看Swift的闭包如何写?

   override func viewDidLoad() {
        super.viewDidLoad()
        //直接调用方法
        printText { () -> Int in
            return 1
        }
    }
    
    func printText(parameters: () -> Int) {
       print(parameters())
    }

我们思考一下,多个参数该如何写?写法如下:

  override func viewDidLoad() {
        super.viewDidLoad()
        printText { () -> Int in
            return 1
        } parameters2: { () -> Int in
            return 2
        }
    }

    func printText(parameters: () -> Int, parameters2:() -> Int) {
        print(parameters())
        print(parameters2())
    }

这时候我门直接调用了printText方法在这个方法内输出了parameters()输出的结果为我们return的数据,这就是最简单的闭包的写法。
除此之外闭包也可以在圆括号内

    override func viewDidLoad() {
        super.viewDidLoad()
        //闭包在圆括号内
        printText(parameters: {return 1})
   
    }

    func printText(parameters: () -> Int) {
       print(parameters())
    }

同样的,我们思考如果多个参数呢?

 override func viewDidLoad() {
        super.viewDidLoad()
        printText(parameters:{ return 1}, parameters2:{ return 2})
    }

    func printText(parameters: () -> Int, parameters2:() -> Int) {
        print(parameters())
        print(parameters2())
    }

还可以在使用尾部闭包方式,闭包体在圆括号之外。

    override func viewDidLoad() {
        super.viewDidLoad()
        //使用尾部闭包方式,闭包体在圆括号之外
        printText {return 1}
    }

    func printText(parameters: () -> Int) {
       print(parameters())
    }

同样思考一个问题,如果多个参数可以这么写?

    override func viewDidLoad() {
        super.viewDidLoad()
        //使用尾部闭包方式,闭包体在圆括号之外
        printText {return 1} parameters2: {return 2}
   
    }

    func printText(parameters: () -> Int, parameters2:() -> Int) {
        print(parameters())
        print(parameters2())
    }

其实上面的写法对于我们return 1、return 2 这样简单的写法来说,Swift给我们提供了一个简便的写法,就是省略return关键字

 override func viewDidLoad() {
        super.viewDidLoad()
        //在 Swift 中对闭包的用法可以进行一些简化,在这种情况下我们可以省略掉 return
        printText(parameters:{ return 1}, parameters2:{ return 2})
    }

    func printText(parameters: () -> Int, parameters2:() -> Int) {
        print(parameters())
        print(parameters2())
    }

Swift 除了上面这些写法以外,还给出了一个叫尾随闭包 (trailing closure)的概念,就是把大括号拿出来,然后省略括号。如下:

 override func viewDidLoad() {
        super.viewDidLoad()
        //使用尾部闭包方式,闭包体在圆括号之外
        printText(parameters: {1}){
            2
        }
    }

    func printText(parameters: () -> Int, parameters2:() -> Int) {
        print(parameters())
        print(parameters2())
    }

这些写法够骚吧??????其实这些都还是华而不实。因为不管哪种方式,表达上不太清晰,看起来不舒服,不够爽。于是@autoclosure就登场了。我们可以改换方法参数。在参数名前面加上@autoclosure关键字:
其实Swift升级后这句话已经有❌错了,应该是在类型前加上@autoclosure关键字。
使用如下:

    override func viewDidLoad() {
        super.viewDidLoad()
        printText(parameters: 1, parameters2: 2)
    }
    func printText( parameters: @autoclosure () -> Int, parameters2: @autoclosure () -> Int) {
        print(parameters())
        print(parameters2())
    }

是这样的!!划重点parameters: @autoclosure () -> Int
这样直接进行调用了,Swift 将会把 1 这个参数表达式自动转换为 () -> Int。这样我们就得到了一个写法简单,表意清楚的式子。
注意

@autoclosure只适用于这样的()->T无参闭包。 说句人话,就是()里面不能有其他东西。
👆就是我们说的自动闭包@autoclosure
其实与@autoclosure相关的还有两个关键字非逃逸闭包(@noescape)和逃逸闭包(@escaping),这两个关键字在Swift3之后已经用不到了。。小编建议是可以不学了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值