从Swift中的void-func提前返回?

时间:2018-02-20 14:37:19

标签: 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 before return
2 after return

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

我有什么遗失的吗?

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

5 个答案:

答案 0 :(得分:11)

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

return
print("Something")

可以推断为return print("Something")

您的解决方案是写

return;
print("Something")

答案 1 :(得分:4)

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返回值

答案 2 :(得分: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"))

执行print语句并返回print ()的返回值。

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

return;
print("2 after return")

然后警告变为:

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

答案 3 :(得分:1)

func noReturn() {...}

相同
func noReturn() -> (Void) {...} //or func noReturn() -> ()

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

答案 4 :(得分:0)

从问题中提取答案:

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

  

“返回”后的代码将永远不会执行

[...]
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