據蘋果documentation,一個封閉的語法如下Swift中Closure塊語法的邏輯推理是什麼?
{ (parameters) -> return type in
statements
}
這背後把參數和返回的花括號內的類型,而不是去用更熟悉的功能類型語法,如邏輯推理
func name(parameters) -> return_type {
statements
}
據蘋果documentation,一個封閉的語法如下Swift中Closure塊語法的邏輯推理是什麼?
{ (parameters) -> return type in
statements
}
這背後把參數和返回的花括號內的類型,而不是去用更熟悉的功能類型語法,如邏輯推理
func name(parameters) -> return_type {
statements
}
的封閉語法是它是爲了方便在一些常見的情況下,簡潔的方式。考慮命名的函數語法,如果它用於閉包(顯然刪除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開發者來說,這很奇怪。但它不會爲封閉工作。
你問爲什麼使用閉包而不是命名函數?因爲它是未命名的功能 –