swift - 用户界面:在 Swift 中执行 { }
问题描述
将所有这些代码包装在一个块中的原因是什么,UI: do { }
我在哪里可以获得关于它的明确说明?
UI: do {
backgroundButton.setImage(UIImage.init(named: "search"), for: .normal)
backgroundButton.backgroundColor = Colors.backgroundButtonBackgroundColor
backgroundButton.tintColor = Colors.backgroundButtonTintColor
}
解决方案
除了用于中断循环的标签(更改控制流)之外,在您的特定示例中,它可能用于组织代码。
所以,在:
UI: do {
//...
}
UI:
是一个带标签的声明,其中UI
是用户定义的标签名称,该名称应具有足够的描述性,以向读者表明或暗示其用途标签声明
您可以为循环语句、if 语句、switch 语句或 do 语句添加语句标签的前缀,语句标签由标签名称后跟冒号 (:) 组成。使用带有 break 和 continue 语句的语句标签来明确说明您希望如何更改循环语句或 switch 语句中的控制流
参考:https ://docs.swift.org/swift-book/ReferenceManual/Statements.html#ID439
do { }
是一个Do 语句做声明
do 语句用于引入新的范围,并且可以选择包含一个或多个 catch 子句,其中包含与定义的错误条件匹配的模式。在 do 语句范围内声明的变量和常量只能在该范围内访问。
参考:https ://docs.swift.org/swift-book/ReferenceManual/Statements.html#ID533
//...
是范围内的所有代码do
使用示例:
在单体函数中,为了提高代码可读性和隔离内部逻辑,可以使用带标签的 do 语句。
所以,如果这是一个单片功能:
func update() {
var hasUpdatedDatasource = false
print("setting datasource")
//N lines of code related to datasource
let strings = ["update", "Datasource"]
print(strings.joined())
hasUpdatedDatasource = strings.count > 2
print("setting something")
//N lines of code related to something
if hasUpdatedDatasource {
print("setting some more stuff")
//N lines of code related to something more
}
print("setting UI")
//N lines of code related to UI
}
在这里,我们看到多行代码,您可以在其中创建/修改变量。基本上很多汤代码会让人很难弄清楚哪组代码行正在处理哪个功能或功能的一部分。
在您的情况下,使用带标签的 do 语句将使代码更具可读性,如下所示:
func update() {
var hasUpdatedDatasource = false
updateDatasource: do {
//do datasource related modification
//N lines of code go here
let datasource = ["update", "Datasource"]
print(datasource.joined())
hasUpdatedDatasource = strings.count > 2
}
doSomething: do {
print("doSomething")
//N lines of code go here
guard hasUpdatedDatasource else { break doSomething }
print("doSomething: More")
//N lines of code go here
}
updateUI: do {
print("updateUI")
//N lines of code go here
}
}
这允许您将一组代码行制作成具有描述性标签名称的代码块,并更清楚地显示逻辑流程。
您可以从其作用域上方访问和修改变量do
,并且由于它具有自己的作用域,因此在内部创建的变量只能在此处访问。
这可以防止变量不必要地逗留到函数结束。
笔记:
updateDatasource
创建了一个datasource
在其范围之外不可用的局部变量,并且...修改了hasUpdatedDatasource
整个函数的局部变量doSomething
有一个 break 语句,可以通过引用它的标签名称随时中断自己
它确实使代码更具可读性,但不一定更易于维护,因为它是有状态的。
就个人而言,我更喜欢将大型函数拆分为更小的或嵌套的函数。但这并不意味着带标签的 do 语句没有它们的位置。
如果它使您的代码更好,那就去做吧。
推荐阅读
- c# - “移动到另一个文件”后错误的大括号布局
- android - 构建失败:后向分支 70 上存在未初始化的对象
- java - 使用 Java 11 启动弹性搜索 5.0.1 时出现 AccessControlException
- camunda - Camunda 不包含任何历史记录
- aggregation - 分类变量的聚合
- java - 我正在尝试构建 url 但出现异常
- awk - 使用 awk 过滤最后 100 行的日志
- css - 如何为具有相同类名的嵌套 div 设置样式?
- asp.net-mvc - Html.DropdownListFor 未在 Internet Explorer 11 中提交所选项目
- c++ - 使用 std::filesystem 输出作为 LPCWSTR