【问题标题】:Swift do-return with guard condition?Swift do-return 有保护条件?
【发布时间】:2020-01-21 08:23:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# swift guard


    【解决方案1】:

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

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

    现在将您的 sn-p 放入一个函数中,并给它一个 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)
    

    return 是否等同于break

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

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

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

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

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

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

    do 有什么作用?

    我们从你的 sn-p 中看不到任何东西。如果您注释掉do { 和相应的},测试仍然会做同样的事情。 do 通常与错误处理 一起使用以包围可能throw 出错的调用。 do 语句通常与catch 语句一起使用,然后捕获抛出的错误。 do { } 本身只是创建了一个新范围。

    【讨论】:

    • 非常感谢!那么,guard 中的return 意味着循环将继续下一个元素?
    • return 来自guard 表示关闭的提前退出。 forEach 将为数组的每个元素执行闭包。提前退出只是意味着它已经完成了该语句,因此它会跳过任何不是.entry 的内容。这可以通过for 循环完成,但在这种情况下,guard 应该执行continuefor oldTuple in oldArray.enumerated() { guard case .entry = oldTuple.element else { continue }}
    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2021-03-22
    • 2021-10-03
    • 2016-05-01
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多