前言
第一次接觸柯里化感覺這個方法很奇怪,當然奇怪也很正常,畢竟蘋果總是不走尋常路的。理解柯里化需要有一定的Swift功底,我盡可能講的通俗易懂些,希望大家多多支持。
開始之前呢,首先我們來復習一下數學知識:
f(x,y) = x + y; 函數f(x,y)是一個接受兩個參數的函數,這個不用解釋了,這要是看不懂,接下來就沒必要看下去了。
我先給他傳一個參數 f(2,y) = 2 + y,這就相當于得到了一個新的函數g(y)=2+y,然后我再給他傳一個參數g(3)=2+3=5,最后得到了這個結果5就相當于是f(2,3) = 2 + 3 = 5,只不過我們每次只傳一個參數。有人可能看出來了,這不就是Swift中的柯里化嗎?沒錯下面不閑扯了進入正題。
Swift中的柯里化
func addThreeNumber(a:Int)(b:Int)(c:Int) -> Int {
return a+b+c
}
根據OC的語法習慣我們都是這么寫的
func addThreeNumber(a:Int,b:Int,c:Int) -> Int {
return a+b+c;
}
但是這兩種方法的區別是什么呢,這就相當于f(2,3,4) = 2+3+4 = 9與g(y,z) = f(2,y,z) = 2+y+z -> h(z) = g(3,z) = 2+3+z -> h(4) = 2+3+4 = 9的區別。
第二個函數不多解釋了,跟OC中是一樣的,柯里化函數我們來看一下它的調用
柯里化方法的調用
let addTowNumber = addThreeNumber(2)// ((b:Int)->(c:Int)-Int)
let addNumber = addTowNumber(b:3) //((c:Int)->Int)
let result = addNumber(c: 4) //int
print("\(result)")//9
我們一步一步來看下這幾行代碼
let addTowNumber = addThreeNumber(2)
首先這行代碼執行完之后函數并未調用,它只是返回了一個接收參數b的函數,并且這個函數又返回一個接收參數c,返回值類型為Int的函數
let addNumber = addTowNumber(b:3)
而這行代碼執行完之后它返回的是一個接收參數c,返回值類型為Int的函數
let result = addNumber(c: 4)
最后這行代碼執行完之后函數才會調用才會把最終的9返回給result。
打個斷點看下具體的代碼執行情況:
柯里化方法的實現原理
func add(a: Int) -> (b:Int) -> (c: Int) -> Int {
return { (b:Int) -> (c: Int) -> Int in //這里返回的是一個接收參數b的函數,并且此函數又返回一個接收參數c,返回值類型為Int的函數
return { (c: Int) -> Int in
return a + b + c;
}
}
}
注意
最后需要注意的是柯里化方法的調用必須按照參數的順序來調用。
柯里化相關文章
Instance Methods are Curried Functions in Swift
函數式編程
如果你對柯里化有一定的了解,Swift應用的也比較熟練可以看下這篇文章
柯里化函數的一個應用是completion handlers