2017-09-17 204 views
1

我完全不知道下面的Swift操作系統代碼示例中的addTwoNumbers函數如何將類型爲(Int,Int) - > Int的函數返回「(+)」簡單地調用「addTwoNumbers(2,2)」。爲什麼Swift函數只能返回一個數學運算符?

我無法在Swift文檔中找到解釋,因爲這個創造性的解決方案似乎不存在。我已經看到StackOverflow回答發表類似的代碼作爲其他問題的答案,但從來沒有解釋爲什麼「=(+)」的作品。我錯過了什麼?

請注意:我知道操作符是一等功能的函數。我也理解高階函數的概念。我縮短了代碼示例以保留主題,即(+)。

let addTwoNumbers: (Int, Int) -> Int = (+) 
print(addTwoNumbers(5,3)) //8 
+0

簡單請@Carcigenicate。在括號中包裹+會使它成爲一個對象嗎?因此,通過用兩個參數調用它,它變成了2 + 2的等價物。 –

+0

@Carcigenicate:來自https://math.stackexchange.com/questions/168378/operator-vs-function的評論,陳述「所有操作符都是函數」。所以當一個函數返回一個運算符(在這種情況下(+)也是一個函數),是否可以安全地通過add(2,2)來調用它,就像打印一樣(「hello」 )?換句話說,我們調用帶有兩個參數的+函數,但不是輸入+(2,2),而是根據提供的代碼示例輸入add(2,2)? –

+0

我的示例和問題是針對高階函數領域中的Swift語言量身定製的,但是您的答案爲我提供了一些方向,可以更好地理解任何語言的概念。 –

回答

0

在您的例子沒有什麼返回+,它的作用是分配價值+(運營商的功能和函數可以被視爲值)爲變量,即addTwoNumbers

該變量的類型是(Int, Int) -> Int,即返回int的兩個int的函數。現在函數是一種特殊類型的變量,可以將括號作爲一種後綴運算符,有點像普通變量需要.。如果您在沒有括號的情況下編寫名稱addTwoNumbers,它指的是函數(恰好是+),但是對於它們和一些操作數,函數會被應用,並且該值將是函數隨這些參數返回的值。

注意let addTwoNumbers: (Int, Int) -> Int = (+)是幾乎等同於func addTwoNumbers(_ a: Int, _ b: Int) -> Int { return a + b }