有人能解释一下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测试)
答案 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