2015-12-18 61 views
1

據蘋果documentation,一個封閉的語法如下Swift中Closure塊語法的邏輯推理是什麼?

{ (parameters) -> return type in 
    statements 
} 

這背後把參數和返回的花括號內的類型,而不是去用更熟悉的功能類型語法,如邏輯推理

func name(parameters) -> return_type { 
     statements 
    } 
+2

你問爲什麼使用閉包而不是命名函數?因爲它是未命名的功能 –

回答

3

的封閉語法是它是爲了方便在一些常見的情況下,簡潔的方式。考慮命名的函數語法,如果它用於閉包(顯然刪除name,因爲閉包是匿名函數文字)。

,而不是目前的做法(在其最詳細的形式):

let f: (Type) -> ReturnType = { (parameter: Type) -> ReturnType in 
    return process(parameter) 
} 

這將是:

let f: (Type) -> ReturnType = func (parameter: Type) -> ReturnType { 
    return process(parameter) 
} 

這有很多的問題。首先,關閉往往可以推斷出它們的參數和返回類型,因此對於語法是:

let f: (Type) -> ReturnType = func (parameter) { 
    return process(parameter) 
} 

這開始變得有點混亂。這是一個返回Void的函數,還是一個返回ReturnType的函數?在標準的命名函數語法中,關閉返回類型意味着Void,但在這裏並不那麼明顯。編譯器是確定的;不會有歧義,但它已經以微妙的方式偏離了命名函數語法。如果所有函數都包含它們的返回類型會更加一致,但我認爲很多Swift開發者會因爲經常輸入-> Void而感到沮喪,或者他們可能已經讓所有函數都有隱式返回類型,像斯卡拉,但他們覺得受到傷害可讀性)

現在考慮的情況下,當參數是隱含的假定回報。

let f: (Type) -> ReturnType = func { process($0)} 

這是一個非常,非常常見的情況。例如,考慮什麼會做map

xs.map(func { process($0) }) 

我認爲額外的func這裏只是噪音。 xs.map{ process($0) }是更好的國際海事組織。

更深層次的問題是爲什麼函數不遵循閉包語法。有實際上是一個很大的好處,如果沒有「辦法」只喜歡功能特性:

struct Foo { 
    let dothing = { (x: Int) -> Int in x * 2 } 
} 

而不是

struct Foo { 
    func dothing(x: Int) -> Int { return x * 2 } 
} 

名爲功能是如此的特例,事實上實際上是怪異關於Swift的東西,它引入了很多令人頭痛的問題(比如你不能使用函數屬性來符合協議,只能使用命名函數)。

但是,提供func語法對C,Java和JavaScript開發人員來說更自然,這就是爲什麼我懷疑它在那裏。對ML和Scala開發者來說,這很奇怪。但它不會爲封閉工作。