Swift关闭奇怪的行为

iam*_*mnp 1 xcode objective-c ios swift swift-playground

为什么这段代码编译(在Playground中):

func text (f: String -> Void) {
    f("text")
}

func foo(s: String) {
    countElements(s)
}

text() {
    s in
        foo(s)
}
Run Code Online (Sandbox Code Playgroud)

而这个不是:

func text (f: String -> Void) {
    f("text")
}

func foo(s: String) {
    countElements(s)
}

text() {
    s in
        countElements(s)
}
Run Code Online (Sandbox Code Playgroud)

有错误消息:

Cannot convert the expression's type '(($T3) -> ($T3) -> $T2) -> (($T3) -> $T2) -> $T2'       to type '_BuiltinIntegerLiteralConvertible'
Run Code Online (Sandbox Code Playgroud)

我可以说有返回类型的东西,有点Swift认为我想返回int但我只想打印它

Ant*_*nio 5

如果添加显式return语句,则第二个版本的代码可以正常工作:

text() {
    s in countElements(s)
    return
}
Run Code Online (Sandbox Code Playgroud)

发生这种情况的原因是它使用隐式返回,作为单个语句闭包,因此它尝试使用返回值countElements,该值与预期的返回类型不匹配Void.显而易见的return修复.

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

更多信息:单表达式闭包的隐式返回