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显式地写出来,提高了阅读性。总体来看既简洁有保证了容易理解。
本文首发于公众号「原住民的自修室」,记录一名产品经理的生活,随想和思考,欢迎订阅。
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容