UI:在 Swift 中执行 { }

ika*_*ava 4 swift

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

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

sta*_*Man 5

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

所以,在:

UI: do {
    //...
}
Run Code Online (Sandbox Code Playgroud)
  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
}
Run Code Online (Sandbox Code Playgroud)

这里我们看到多行代码,您可能在其中创建/修改变量。基本上大量的汤代码会让人很难弄清楚哪一组代码行正在处理哪个功能或函数的一部分。

使用带标签的 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
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许您将一组代码行制作成带有描述性标签名称的代码块,并更清晰地显示逻辑流程。
您可以从其do范围上方访问和修改变量,并且由于它有自己的范围,因此内部创建的变量只能在此处访问。
这可以防止变量不必要地停留到函数结束。

笔记:

  • updateDatasource创建了一个局部变量datasource,该变量在其作用域之外不可用,并且...修改了一个hasUpdatedDatasource对于整个函数来说是局部的变量
  • doSomething有一个break语句,可以通过引用它的标签名称随时中断自身

它确实使代码更具可读性,但不一定更易于维护,因为它是有状态的。
就我个人而言,我更喜欢将大型函数拆分为较小的函数或嵌套函数。但这并不意味着带标签的 do 语句没有它们的位置。
如果它能让你的代码变得更好,那就去做吧。