有警卫条件的迅速复归?

时间:2019-09-20 09:29:58

标签: c# swift guard

我正在尝试将一些Swift代码转换为C#。我阅读了文档,但无法掌握此代码块的功能。我无法运行代码,因此使其变得更加困难。请帮忙!

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

        // Do stuff
    }
}
  1. return等同于break吗?
  2. guard条件是什么?一些任务...?

1 个答案:

答案 0 :(得分:1)

快速游乐场是探索该语言的好地方。即使您无法运行整个代码,也可以在代码周围放一些支持件,以查看发生了什么。

oldArray显然拥有一些enum值。从您的代码段中,我们可以看到其中一个值是.entry。我出于探索目的创建了一个名为enum的{​​{1}},并给出了几种情况(Stateentryfoo)。

现在将您的代码片段放入一个函数中,并为其提供一个bar即可使用。在oldArray部分中添加print,事实将被揭示:

// Do stuff

输出

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) 等同于return吗?

如果不满足break条件,它将从闭包中返回。

  

guard条件是什么?一些任务...?

guard.enumerated变成oldArray元组的序列。因此,示例数组变为(offset: Int, element: State)[(offset: 0, element: .entry), (offset: 1, element: .entry), ...]依次获取每个元组,并将其分配给forEach

oldTuple使用模式匹配来验证当前元组的guard值为element,否则退出闭包。

语法有点奇怪,但是要说,要继续执行该语句,当前元组的.entry必须为element,否则为.entry放弃处理此元素

因此,此代码循环遍历枚举数组,并且仅处理return枚举。

  

.entry的作用是什么?

我们无法从您的摘要中看到任何内容。如果您注释掉do和相应的do {,则测试仍会执行相同的操作。 }通常与错误处理一起使用,以包围可能do错误的呼叫。 throw语句通常与do语句一起使用,然后捕获抛出的错误。 catch本身仅创建一个新范围。