2014-10-11 48 views
0

鉴于下面的函数声明闭合表达式{EXP} VS {返回EXP}

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

是什么在下面的代码两种变体使用闭合表达式的差:)

let result = foo { 
    return Foo() 
} 

B)

let result = foo { 
    Foo() 
} 

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

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

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

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

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

+0

相关:http://stackoverflow.com/q/26305402/335858 – dasblinkenlight 2014-10-11 10:51:52

+0

dasblinkenlight: “这看起来像一个编译器错误给我。”我同意,这可能是一个明显的原因。我已经在几天(几个星期前)之前提交了一份相关的错误报告。 – CouchDeveloper 2014-10-11 10:55:37

回答

0

foo函数返回Bar。所以编译器可以很容易推断出resultBarFoo()返回Foo实例。因此,无论您是否指定return,编译器都可以轻松推断出关闭是正确的。这里是我在Xcode 6.0.1操场上玩的代码。

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()