闭包表达式{exp} vs {return exp}

时间:2014-10-11 10:48:33

标签: ios macos swift closures

给出以下函数声明

func foo(f:()->Foo) -> Bar

使用Closure表达式的以下两种代码变体有什么不同:

A)

let result = foo { 
    return Foo()
}

B)

let result = foo { 
    Foo()
}

请注意,常量result的类型未指定,必须推断。

我之所以要问的是编译器似乎有所作为 - 至少目前是这样。这是因为在很多情况下,当使用return Foo()作为闭包表达式时,编译器无法推断闭包表达式的类型。另一方面省略return可能会由编译器发出另一个错误,因为它可能需要return(即使我不同意编译器,但我确实离题了......)

这个问题通常可以通过完全指定闭包表达式来解决,例如:

let result = foo { () -> Foo in
    return Foo()
}

或有时可以通过明确指定result的类型来缓解。

1 个答案:

答案 0 :(得分:0)

foo函数返回Bar。因此,编译器可以轻松推断resultBarFoo()返回Foo个实例。因此,无论您是否指定return,编译器都可以轻松推断闭包是否正确。这是我在Xcode 6.0.1 playground中使用的代码。

struct Foo {
    func foos() {
        println("foos")
    }
}

struct Bar {
    func bars() {
        println("bars")
    }
}

func foo(f: () -> Foo) -> Bar {
    let foof = f()
    foof.foos()
    return Bar()
}

let result = foo {
    return Foo()
}

result.bars()