CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

Swift中多Closure函数的语法糖,以Button为例-源码交易平台丞旭猿

SwiftUI 中 Button 在官方文档中的初始函数定义是init(action: () -> Void, label: () -> Label),但在实际使用时,我们常常写成:

Button{Dosomething}label:{Text("buttonName")}

这个语法仔细看起来十分奇怪,因为按照 Swift 常见的尾随闭包,应该是最后一个参数不加标签,前面的参数增加标签才对,如下:

Button (action: {Do something }){ Text("buttonName") }

难道这是一个新的语法?于是我查了下相关文档

果然,这是 Swift 5.3 新增的一个新语法,

If a function takes multiple closures, you omit the argument label for the first trailing closure and you label the remaining trailing closures.

这个语法的规则是,如果一个函数接受多个闭包,那么第一个闭包不需要加参数名,后面的闭包加上参数名。

那么为什么要这么改?在 Swift 语言迭代的文档里有详细的解释,简单来说,是因为如果在多个闭包的情况下也只允许最后一个作为尾随闭包的话,会出现代码难以阅读的情况。

因为大多数情况下,函数中第一个闭包是最重要的,往往是这个函数核心功能相关的,后面的闭包是处理错误等不太重要的,或者可选的。按照旧版的写法,重要的闭包夹在中间作为参数,不重要的闭包则在结尾展开,并且没有参数名称,会导致难以阅读。

以 UI 动画这个函数为例:

// 1、不使用尾随闭包的实现:
UIView.animate(withDuration: 0.3, animations: {
  self.view.alpha = 0
}, completion: { _ in
  self.view.removeFromSuperview()
})
// 2、5.3之前使用尾随闭包的实现:
UIView.animate(withDuration: 0.3, animations: {
  self.view.alpha = 0
}) { _ in
  self.view.removeFromSuperview()
}
// 3、5.3之后使用尾随闭包的实现
UIView.animate(withDuration: 0.3) {
  self.view.alpha = 0
} completion: { _ in
  self.view.removeFromSuperview()
}

上面的代码可以直观地看到三种实现方式的区别:

1、不使用尾随闭包,函数中会夹杂大量(){},可阅读性差

2、使用尾随闭包,但问题在于completion的标签被省略了,而对于animate这个函数来说,我们很难直接知道他最后一个闭包是completion。

3、使用新版的闭包语法。对于animate这个函数来说,animation这个参数是它的核心参数,所以直接省略标签,我们还是能理解的。而后面的completion显式地写出来,提高了阅读性。总体来看既简洁有保证了容易理解。

本文首发于公众号「原住民的自修室」,记录一名产品经理的生活,随想和思考,欢迎订阅。

声明:本文部分素材转载自互联网,如有侵权立即删除 。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容