首页 > 解决方案 > 用户界面:在 Swift 中执行 { }

问题描述

将所有这些代码包装在一个块中的原因是什么,UI: do { }我在哪里可以获得关于它的明确说明?

UI: do {
    backgroundButton.setImage(UIImage.init(named: "search"), for: .normal)
    backgroundButton.backgroundColor = Colors.backgroundButtonBackgroundColor
    backgroundButton.tintColor = Colors.backgroundButtonTintColor
}

标签: swift

解决方案


除了用于中断循环的标签(更改控制流)之外,在您的特定示例中,它可能用于组织代码。

所以,在:

UI: do {
    //...
}
  1. UI:是一个带标签的声明,其中UI是用户定义的标签名称,该名称应具有足够的描述性,以向读者表明或暗示其用途

    标签声明

    您可以为循环语句、if 语句、switch 语句或 do 语句添加语句标签的前缀,语句标签由标签名称后跟冒号 (:) 组成。使用带有 break 和 continue 语句的语句标签来明确说明您希望如何更改循环语句或 switch 语句中的控制流

    参考:https ://docs.swift.org/swift-book/ReferenceManual/Statements.html#ID439

  2. do { }是一个Do 语句

    做声明

    do 语句用于引入新的范围,并且可以选择包含一个或多个 catch 子句,其中包含与定义的错误条件匹配的模式。在 do 语句范围内声明的变量和常量只能在该范围内访问。

    参考:https ://docs.swift.org/swift-book/ReferenceManual/Statements.html#ID533

  3. //...是范围内的所有代码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 语句没有它们的位置。
如果它使您的代码更好,那就去做吧。


推荐阅读