迅速关闭奇怪的行为

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)

UICollectionView(插入和删除项目)的奇怪动画行为[关闭]

双重比较的C ++非常奇怪的行为[关闭]