从Swift中的无效func提前返回?

从Swift中的无效func提前返回?,swift,Swift,有人能用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 b

有人能用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”)
永远不会执行,因为它在
return
语句之后

我有什么遗漏吗


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

当我在IBM Swift沙盒中尝试此功能时,我收到以下警告:

这很好地解释了这个问题。斯威夫特将其解释为您曾经写道:

return(print("2 after return"))
执行print语句并返回print
()
的返回值

添加
使其成为单独的语句

return;
print("2 after return")
然后警告变成:


这是一件棘手的事情,Swift不需要分号(它们是可选的),这使得Swift编译器能够自动推断下一行应该是新行,还是旧行的补全
print()
是一个返回void的函数。因此,单词
return print(“某物”)
是有效的。所以

return
print("Something")
可以推断为
返回打印(“某物”)

你的解决办法是写作

return;
print("Something")

func noReturn() -> (Void) {...} //or func noReturn() -> ()
由于print(…)具有相同的签名,因此可以调用 返回打印(…) 在void函数中

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
}
错误:无效函数2中出现意外的非无效返回值^


答案摘自问题:

问题似乎在于,swift不会在void函数中的return语句中立即退出函数,而是使用连续的
void
值作为函数参数,如果该值为非void,则按预期终止。

“return”之后的代码将永远不会执行

[…]

返回;//嗯,真奇怪。但是,如果在test2中添加分号efter return,“return之后的2”不会被打印出来。但正如你所说,它根本不应该被打印出来。是的,它包含了它们,如果你愿意,你可以使用分号,例如:你想把两条语句放在同一行,使用
print(“这是第一条”);打印(“这是第二次”)
。但是分号是可选的,不会产生编译错误
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
}
[...]
return; // <- would return here

[...]
return () // <- would return here

[...]
return // <- would return here
let x = 42
[...]
return
print("oh no") // <- would return here

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