迅速关闭奇怪的行为
Posted
技术标签:
【中文标题】迅速关闭奇怪的行为【英文标题】:Swift closure strange behaviour 【发布时间】:2014-11-07 11:50:28 【问题描述】:为什么这段代码会编译(在 Playground 中):
func text (f: String -> Void)
f("text")
func foo(s: String)
countElements(s)
text()
s in
foo(s)
而这个没有:
func text (f: String -> Void)
f("text")
func foo(s: String)
countElements(s)
text()
s in
countElements(s)
带有错误信息:
Cannot convert the expression's type '(($T3) -> ($T3) -> $T2) -> (($T3) -> $T2) -> $T2' to type '_BuiltinIntegerLiteralConvertible'
我可以看出有些东西有返回类型,有点 Swift 认为我想返回 int 但我只想打印它
【问题讨论】:
【参考方案1】:如果您添加明确的return
语句,则代码的第二个版本可以工作:
text()
s in countElements(s)
return
发生这种情况的原因是它使用了隐式返回,这是一个单语句闭包,因此它尝试使用与预期返回类型Void
不匹配的countElements
的返回值。显式的return
解决了这个问题。
至于为什么它的行为方式不同,在前一种情况下foo
隐式返回Void
,它与闭包返回类型匹配。
更多信息:Implicit Returns from Single-Expression Closures
【讨论】:
以上是关于迅速关闭奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章
从服务器端关闭连接时的 QAbstractSocket 奇怪行为
FBSDKAppInviteDialog 总是关闭和结果的奇怪行为(null)