Swift关闭奇怪的行为

时间:2014-11-07 11:50:29

标签: ios objective-c xcode swift swift-playground

为什么这段代码会编译(在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 个答案:

答案 0 :(得分:5)

如果添加明确的return语句,则代码的第二个版本可以使用:

text() {
    s in countElements(s)
    return
}

发生这种情况的原因是它使用隐式返回,是单个语句闭包,因此它尝试使用countElements的返回值,它与预期的返回类型{{1}不匹配}}。明确的Void修复了这一点。

至于为什么它以不同的方式运行,在前一种情况下return隐式返回foo,它匹配闭包返回类型。

更多信息:Implicit Returns from Single-Expression Closures