Swift do-return with guard condition?

Swift do-return with guard condition?

我正在尝试将一些 Swift 代码翻译成 C#。我阅读了文档,但无法理解此代码块的作用。我无法 运行 代码,这使它变得更加困难。请帮忙!

do {
    oldArray.enumerated().forEach { oldTuple in
        guard case .entry = oldTuple.element else {
            return
        }

        // Do stuff
    }
}
  1. 这个 return 等同于 break 吗?
  2. guard条件是什么?一些作业...?

Swift 操场是探索语言的好地方。即使您无法 运行 整个代码,您也可以在其周围放置一些支持片段以查看发生了什么。

oldArray 显然包含一些 enum 值。从您的代码片段中,我们可以看到其中一个值是 .entry。我创建了一个名为 Stateenum 用于探索目的,并给出了一些案例(entryfoobar)。

现在将您的代码片段放入一个函数中,并给它一个 oldArray 来处理。在// Do stuff段加一个print,真相大白:

enum State {
    case entry
    case foo
    case bar
}

func test() {
    let oldArray: [State] = [.entry, .entry, .bar, .entry, .foo]

    do {
        oldArray.enumerated().forEach { oldTuple in
            guard case .entry = oldTuple.element else {
                return
            }

            // Do stuff
            print(oldTuple)
        }
    }
}

test()

输出

(offset: 0, element: __lldb_expr_1.State.entry)
(offset: 1, element: __lldb_expr_1.State.entry)
(offset: 3, element: __lldb_expr_1.State.entry)

Is this return equivalent to a break?

如果 guard 条件不满足,它 returns 从关闭。

What is the guard condition? Some assignment...?

.enumeratedoldArray 转换为 (offset: Int, element: State) 元组序列。所以示例数组变为 [(offset: 0, element: .entry), (offset: 1, element: .entry), ...]forEach 依次获取每个元组并将其分配给 oldTuple.

guard正在使用模式匹配来验证当前元组的element值为.entry,否则它会退出闭包。

语法有点奇怪,但它是说,要继续超出此语句,当前元组的 element 必须是 .entry 否则 return从闭包中放弃处理这个元素.

因此,此代码循环遍历枚举数组并仅处理 .entry.

的枚举

What does the do do?

我们无法从您的代码段中看到任何内容。如果你注释掉 do { 和相应的 } 测试仍然做同样的事情。 do 通常与 错误处理 一起使用,以包围可能 throw 错误的调用。 do 语句通常与 catch 语句一起使用,然后捕获抛出的错误。就其本身而言,do { } 只是创建了一个新范围。