2014-10-11 47 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()