一. 干嘛的,舉個例子
舉個簡單的例子,我們有一個需求,快速的拼接一個班級所有同學(xué)的姓名,性別,年齡及考試成績,那么,按照一般的思路,我們要怎么實現(xiàn)呢?
方法實現(xiàn):
@discardableResult
func studentInformation(name:String,gender:String,age:String,score:String) -> String {
return "姓名:"+name+"性別:"+gender+"年齡:"+age+"成績:"+score
}
方法調(diào)用:
studentInformation(name: "小明", gender: "男", age: "15", score: "99")
studentInformation(name: "小紅", gender: "女", age: "15", score: "98")
studentInformation(name: "小藍", gender: "男", age: "14", score: "97")
studentInformation(name: "小花", gender: "女", age: "14", score: "93")
......
一個班級可能還好,幾十個人,但如果是一個學(xué)校,甚至一個省市呢?這樣調(diào)用方法費時費力還不好看。
而我們發(fā)現(xiàn),性別無非是男或者女,年齡假設(shè)我們統(tǒng)計的都為同一個年級的,那么,也只有幾個數(shù)字而已,那是不是寫兩個方法,每個性別一個方法呢?這樣同樣顯得很蠢,這時候,我們就可以使用柯里化來方便的解決問題了:
方法實現(xiàn):
@discardableResult
func studentInformation(gender: String)->(_ age: String)->(_ name: String,_ score:String)-> String {
return { (age: String)->(_ name: String,_ score:String)->String in
return {(name: String,_ score:String)->String in
return "姓名:"+name+"性別:"+gender+"年齡:"+age+"成績:"+score
}
}
}
方法調(diào)用:
// 定義性別方法
let boy = studentInformation(gender: "男")
let girl = studentInformation(gender: "女")
// 定義不同性別的年齡方法
let boy14 = boy("14")
let boy15 = boy("15")
let girl14 = girl("14")
let girl15 = girl("15")
// 對象實例化,調(diào)用方法
let xm = boy15("小明","99")
let xh= girl15("小紅","98")
let xl = boy14("小藍","97")
let xhua= girl14("小花","93")
OK,使用場景已經(jīng)介紹完了,那么,我們又該怎么理解函數(shù)柯里化呢?
我個人理解,柯里化函數(shù),很像是一個工廠方法,只不過他生產(chǎn)出來的不是控件啊UI之類的,而是各種各樣底層相同,部分參數(shù)重復(fù)率高的方法。比如我們舉的這個例子,方法的底層都是對四個參數(shù)的拼接,而性別和年齡,是重復(fù)率高的參數(shù)。有了這些,我們看下柯里化的定義:
在計算機科學(xué)中,柯里化(Currying)又稱部分求值(Partial Evaluation,是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。
關(guān)鍵詞:
1. 部分求值:
在調(diào)用柯里化函數(shù)的過程中,我們是將參數(shù)逐一傳遞給函數(shù)。而函數(shù),根據(jù)所傳入的參數(shù),只會部分調(diào)用方法中的內(nèi)容。比如,我們只傳入性別的時候,方法是不會調(diào)用到下面這部分代碼的,大家可以自己打斷點調(diào)試
return {(name: String,_ score:String)->String in
return "姓名:"+name+"性別:"+gender+"年齡:"+age+"成績:"+score
}
當(dāng)然,我們也可以一口氣把函數(shù)的所有參數(shù)都傳進去,這樣就類似鏈?zhǔn)骄幊塘耍?/p>
// 祭出老學(xué)長李雷
let liLei = studentInformation(gender: "男")("48")("李雷", "100")
使用注意:
1. 柯里化函數(shù)的參數(shù)必須按順序調(diào)用,所以我們必須安排好參數(shù)的順序。重復(fù)率高的參數(shù)放在前面例,如性別和年齡,重復(fù)率低的放在后面,如姓名和年齡
2. 柯里化函數(shù)代碼只會調(diào)用一次,比如 let boy14 = boy("14")時調(diào)用到了return {(name: String,_ score:String)->String in這一行,那么在 let xl = boy14("小藍","97")就不會再次調(diào)用這一行,而是直接執(zhí)行return "姓名:"+name+"性別:"+gender+"年齡:"+age+"成績:"+score,這個大家可以自己打斷點測試一下
參考文章:
【Swift之柯里化函數(shù)(精品)】| 那些人追的干貨
Swift中的函數(shù)柯里化(Function Currying)