2014-06-10 29 views
7

這是函數還是閉包?Swift:函數的定義和語法與閉包

let triple: Int -> Int = { 
    (number: Int) in // What is this? 
    let result = 3 * number 
    number 
    return result 
} 

triple(1) 
+3

前的東西'in'分配輸入功能給變量那裏。在這種情況下'number'將被分配給傳遞給該閉包的輸入參數,即'1'。 'in'與'inout'完全無關,它通過引用指定傳遞 – Jack

回答

9

1:這是一個封閉。

例子:

func aFunction() ->() { 
    // do something 
} 

let aClosure:() ->() = { 
    // do something 
} 

函數實際上是封閉的特殊情況。用括號({})代碼可以編寫一個不帶名稱的 閉包。用於 將參數和返回類型分開。

摘錄自:Apple Inc.「The Swift Programming Language。」iBooks。 https://itun.es/us/jEUH0.l

2:「在」只是選擇代表其中參數/返回類型端,和封閉的身體開始的符號。它與inout無關。

+2

爲什麼我使用函數而不使用閉包或者與此相反?真正的區別是什麼? –

5

那封綁定到固定triple這要是在全球範圍內做的是類似於宣佈它作爲一個函數(參見下面的差異由Eric評論)。 (number: Int) in行聲明閉包的輸入參數。

在這種情況下,類型可以被排除在外,雖然,因爲它可以從封閉類型進行推斷,因爲它只有一個語句就可以寫成與隱含收益爲封閉表達式:

let triple: Int -> Int = { number in 
    3 * number 
} 

// or as a function 
func triple(number: Int) -> Int { 
    return 3 * number 
} 

// Or as the very short 
let triple: Int -> Int = { 3 * $0 } 

您可以在關於關閉的官方文檔章節中閱讀更多關於它的信息。

https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Closures.html

+3

將一個閉包綁定到一個變量類似於,但**不是**,就像將它聲明爲一個函數一樣。重要差異的三個示例包括重載,默認參數值和泛型,這些綁定關閉都無法支持。 –

+0

的確如此,我已經用一個指向這個評論的指針更新了答案。 – hallski

4

夫特閉包的定義如下:

{ (parameters) -> return type in 
    statements 
} 

因此,您的代碼示例被認爲是由定義的封閉件。然而,由大括號內移動的返回類型如下我想重寫:

let triple = { 
    (number: Int) -> Int in 
    let result = 3 * number 
    number 
    return result 
} 

triple(1) 

的參數和返回的大括號後型開始與在關鍵字之前的端部和封閉件的主體後開始in關鍵字並在結束大括號處結束。接下來,我會建議您下載並從其中可以在以下位置找到的iTunes閱讀的iBook:

https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

3

一個簡單的方法函數和閉包是區分,

全局功能:有一個名稱。不要捕獲任何值。

嵌套函數:有一個。從封閉函數捕獲值。

關閉:不具有名稱喜歡的功能。捕獲來自相鄰塊的值。

3

函數是一個名稱爲閉包。你所提供的封閉,有一個名字,因此既是功能又是封閉。

從蘋果的開發者網站:

全球和嵌套功能,在功能推出,實際上是封閉的 特殊情況。閉包採取以下三種形式之一:

全局函數是具有名稱並且不捕獲任何 值的閉包。嵌套函數是具有名稱的閉包,可以從其封閉函數中捕獲 值。關閉表達式未命名爲 以輕量級語法編寫的閉包,可以從 中捕獲周圍環境的值。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html