前言
前段時(shí)間在iOS技術(shù)群里面有人提到柯里化焕参,當(dāng)時(shí)有點(diǎn)懵,也沒有管齿梁。最近項(xiàng)目不緊張了催植,決定來研究研究肮蛹。順便和大家分享一下我對(duì)Currying的理解。
什么是柯里化函數(shù)创南?
柯里化伦忠,又稱部分求值,是一種函數(shù)式編程思想稿辙,就是把接收多個(gè)參數(shù)的函數(shù)轉(zhuǎn)換成接收一個(gè)單一參數(shù)的函數(shù)昆码,并且返回一個(gè)接受余下參數(shù)的新函數(shù)技術(shù)。
柯里化函數(shù)的運(yùn)用
舉個(gè)簡(jiǎn)單的例子邻储,下面的函數(shù)簡(jiǎn)單的將輸入的數(shù)加1:
func addOne(num : Int) -> Int {
return num + 1
}
上面這個(gè)函數(shù)滿足我們的需求赋咽,實(shí)現(xiàn)了將輸入的值加1,但是如果要實(shí)現(xiàn)加2芥备,加3冬耿,加n呢。這個(gè)時(shí)候我們需要定義一個(gè)通用的函數(shù)萌壳。有人可能想到傳入2個(gè)參數(shù)的方式去實(shí)現(xiàn)亦镶,比如說:
func add(num1 : Int, num2 : Int) -> Int {
return num1 + num2
}
當(dāng)然這種方法是可以的,但是我要向大家推薦的是另一種寫法袱瓮,那就是用函數(shù)式編程的思想去解決缤骨,也是定義一個(gè)函數(shù),這個(gè)函數(shù)它將接收需要與數(shù)字相加的數(shù)尺借,并返回一個(gè)函數(shù)绊起,返回的函數(shù)將接收輸入數(shù)字本身,然后進(jìn)行操作:
func addTo(adder: Int)-> Int -> Int {
return {
num in
return num + adder
}
}
let addTwo = addTo(2)//實(shí)現(xiàn)一個(gè)數(shù)加2 燎斩,這里就是接收需要相加的數(shù)字虱歪,并且返回一個(gè)函數(shù) Int -> Int
let result = addTwo(4)//返回的函數(shù)將接收輸入的數(shù)字,也就是我們這里的4.然后進(jìn)行操作返回結(jié)果
print(result)//6
如果沒有swift開發(fā)經(jīng)驗(yàn)的話栅表,可能看到這里會(huì)有點(diǎn)懵笋鄙,那下面我將換一種簡(jiǎn)單明了的寫法,順便分享一下它的實(shí)現(xiàn)原理:
//定義一個(gè)接收參數(shù)num1怪瓶,返回一個(gè)接收參數(shù)num2 的函數(shù)萧落,并且這個(gè)函數(shù)的返回值是為Int類型的函數(shù)
func add(num1 : Int) -> (num2 : Int) -> Int {
//一個(gè)接收參數(shù)num2的函數(shù),并且有返回結(jié)果為Int類型的函數(shù)
return { (num2: Int) -> Int in
return num1 + num2
}
}
使用柯里化函數(shù)的注意事項(xiàng)
1洗贰、必須按照參數(shù)的定義順序來調(diào)用找岖,否則容易報(bào)錯(cuò)
2、柯里化函數(shù)的函數(shù)體只會(huì)被執(zhí)行一次敛滋,只會(huì)在調(diào)用完最后一個(gè)參數(shù)的時(shí)候執(zhí)行柯化里函數(shù)體许布,這個(gè)可以打斷點(diǎn)調(diào)試。
//不會(huì)調(diào)用柯里化函數(shù)
let addTwo = addTo(2)//實(shí)現(xiàn)一個(gè)數(shù)加2 绎晃,這里就是接收需要相加的數(shù)字爹脾,并且返回一個(gè)函數(shù) Int -> Int
print(addTwo)//(Function)
//執(zhí)行柯里化函數(shù)體
let result = addTwo(4)//返回的函數(shù)將接收輸入的數(shù)字帖旨,也就是我們這里的4.然后進(jìn)行操作返回結(jié)果
print(result)//6
柯里化函數(shù)的優(yōu)點(diǎn)
1、代碼簡(jiǎn)潔
2灵妨、提高了代碼的復(fù)用率
3解阅、每個(gè)函數(shù)都是一個(gè)單獨(dú)的模塊,很容易進(jìn)行單元測(cè)試
4泌霍、不用修改原來的值货抄,因?yàn)榉祷氐亩际切碌闹?/p>
柯里化函數(shù)的實(shí)用性
1、實(shí)用性一:復(fù)用性
需求1:地圖類產(chǎn)品朱转,很多界面都有相同的功能模塊蟹地,比如搜索框。
我們可以利用柯里化函數(shù)藤为,來組裝界面怪与,把界面分成一個(gè)個(gè)小模塊,這樣其他界面有相同的模塊缅疟,直接運(yùn)用模塊代碼分别,去重新組裝下就好了。
2存淫、實(shí)用性二:延遲性耘斩,柯里化函數(shù)代碼需要前面的方法調(diào)用完成之后,才會(huì)來到柯里化函數(shù)代碼中桅咆。
需求2:閱讀類產(chǎn)品括授,一個(gè)界面的顯示,依賴于數(shù)據(jù)岩饼,需要加載完數(shù)據(jù)之后荚虚,才能判斷界面顯示。