【问题标题】:early return from a void-func in Swift?从 Swift 中的 void-func 提前返回?
【发布时间】:2018-10-05 13:30:01
【问题描述】:

有人可以解释一下 Swift 中的以下行为吗?

func test() -> Bool {
    print("1 before return")
    return false
    print("1 after return")
}


func test2() {
    print("2 before return")
    return
    print("2 after return")
}


test()
test2()

返回:

1 before return
2 before return
2 after return

我希望print("2 after return") 永远不会被执行,因为它在return 语句之后。

我有什么遗漏吗?

(使用 Swift 4 / 4.1 和 Xcode 9.2 / Xcode 9.3 beta 2 测试)

【问题讨论】:

  • 嗯,这真的很奇怪。但是,如果我在 test2 中添加分号后返回,则不会打印“返回后 2”。但正如你所说,它根本不应该被打印出来。

标签: swift


【解决方案1】:

这是一件棘手的事情,Swift 不需要分号(它们是可选的),这使得 Swift 编译器会自动推断下一行应该是新行还是旧行的完成。 print() 是一个返回 void 的函数。所以return print("something")这个词是有效的。所以

return
print("Something")

可以推导出为return print("Something")

你的解决方案是写

return;
print("Something")

【讨论】:

  • 是的,它包含它们,如果你愿意,你可以使用分号,例如:你想把两个语句放在同一行使用print("This is first"); print("This is second")。但是分号是可选的,不会产生编译错误
【解决方案2】:

func test2() 类似于func test2() -> Void

所以你的代码被视为,

func test2() -> Void {
  print("2 before return")
  return print("2 after return")
}

在打印后添加分号应该可以解决它。

func test2() -> Void {
  print("2 before return")
  return; print("2 after return")
}

如果你把值类型放在返回行之后你也可以看到错误,你会明白更多,

func test2() {
  print("2 before return")
  return
  2
}

错误:void 函数 2 中出现意外的非 void 返回值 ^

【讨论】:

    【解决方案3】:

    当我在 IBM Swift Sandbox 中尝试此操作时,我收到了以下警告:

    warning: expression following 'return' is treated as an argument of the 'return'
        print("2 after return")
        ^
    

    这几乎解释了这个问题。斯威夫特正在解释它,就像你写的一样:

    return(print("2 after return"))
    

    执行打印语句,返回打印()的返回值。

    在返回后添加; 使其成为单独的语句

    return;
    print("2 after return")
    

    然后警告变为:

    warning: code after 'return' will never be executed
        print("2 after return")
    

    【讨论】:

      【解决方案4】:
      func noReturn() {...}
      

      一样
      func noReturn() -> (Void) {...} //or func noReturn() -> ()
      

      并且由于 print(...) 具有相同的签名,因此可以调用 返回打印(...) 在一个 void 函数中

      【讨论】:

        【解决方案5】:

        从问题中提取的答案:

        问题似乎是,swift 不会在 void 函数中的 return 语句上立即退出函数并且使用连续的 void 值作为函数参数并终止为如果它是非无效的,则预期。

        'return' 之后的代码永远不会被执行

        [...]
        return; // <- would return here
        
        [...]
        return () // <- would return here
        
        [...]
        return // <- would return here
        let x = 42
        

        如果 Xcode 能够可靠地工作,则应该在下一个示例中显示此消息:

        'return' 后面的表达式被视为 'return' 的参数

        [...]
        return
        print("oh no") // <- would return here
        
        [...]
        return
        myClosure("this feels wrong") // <- would return here and execute the function / closure
        

        自 2016 年以来,此问题已在 Swift-bug-tracker 中: https://bugs.swift.org/browse/SR-2028

        【讨论】:

          猜你喜欢
          • 2020-10-13
          • 2021-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-31
          • 1970-01-01
          • 2015-04-08
          • 2021-06-27
          相关资源
          最近更新 更多