柯里化可以認為是在編碼過程中發現眾多相似的函數定義后,將它們抽象成一個高階函數,一般來說這個高階函數接受多個參數,通過控制傳入參數可以使高階函數變形為滿足功能需求的低階函數。swift的柯里化也是其函數式的特點的重要表現之一。
舉個例子:
開始我們要編寫一個函數輸入一個參數返回加1后的結果。
func addOne (num:Int) -> Int {
return num + 1;
}
然后需求增加,我們需要編寫一個函數輸入一個參數返回其加2后的結果
func addTwo (num:Int) -> Int {
return num + 2;
}
這里就只是1和2的不同,但是我們需要定義兩個函數,如果相似需求的增加我們也要相應定義更多的函數。難道我們沒有更通用的方法嗎?其實使用Currying就能很好的解決上面的問題。我們可以定義一個通用的函數它接受一個與輸入數字相加的數,并返回一個函數。返回的函數將接受輸入數字本身,然后進行操作。可以我們是先定義一個高階的函數,然后使用高階的函數生產出我們需要的函數:
func addTo(_ adder: Int) -> (Int) -> Int {
return { num in
return num + adder
}
}
let addOne = addTo(1) //addOne: Int -> Int
let addTwo = addTo(2) //addTwo: Int -> Int
let oneResult = addOne(3) // oneResult == 4
let twoResult = addTwo(4) // twoResult == 6
可以看出Currying是一種量產相似函數的好方法,它可以避免寫出很多重復的代碼,也方便了日后的維護。