一. Currying解釋
- currying 翻譯為局部套用.又稱為部分求值(Partial Evaluation), 是一種函數式編程思想,在Swfit4.0的 時候已經廢棄了函數的柯里化. 函數的 currying 特性的使用場景并不大,但他會增加很多語言的復雜性,所以需要刪除它,但是柯里化函數式編程思想還是很重要的.
- 特點:
只用“表達式”(表達式:單純的運算過程,總是有返回值),不用“語句”(語句:執行某種操作,沒有返回值)。2.不修改值,只返回新值。
- 好處:
代碼簡潔
提高代碼復用性
代碼管理方便,相互之間不依賴,每個函數都 是一個獨立的模塊,很容易進行單元測試。
易于“并發編程”,因為不修改變量的值,都是返回新值。
最大的好處就是能把函數當參數用!!
二. 代碼示例
需求: 需要三個函數.
- 第一個函數,在自身上+1.
- 第一個函數,在自身上+2.
- 第一個函數,在自身上+3.
func addTo(_ adder : Int) -> (Int) -> Int {
return {
num in
return num + adder
}
}
// 使用
let addOne = addTo(1000)
let result_one = addOne(1)
print(result_one)
/**
addTo(1000) 返回一個閉包 (Int) -> Int
num in 的意思是: 用in把參數和方法隔開. num就是閉包的入參(Int)
該閉包里面執行的是 return num + adder.
*/
// 這是一個字符串的示例
func strAppends(_ a : String) -> (String) -> String {
return {
b in
return a + b
}
}
將一個普通的三個入參的函數轉化為柯里化函數
func add(a: Int, b: Int, c: Int) -> Int{
print("\(a) + \(b) + \(c)")
return a + b + c
}
func add(_ a: Int) -> (Int) -> (Int) -> Int{
return {
b in
return {
c in
a + b + c
}
}
}
// 使用
let one = add(1)
let result = one(2)(3)
print(result)
沒有返回值的
func printString(_ month : Int) -> (Int) -> (String) -> Void {
return {
day in
return {
action in
print("\(month)月" + "\(day)日" + "\(action)")
}
}
}
// 使用
printString(8)(25)("我想找個對象")
// 輸出: 8月25日我想找個對象