Swift 柯里化函數(shù)-總結(jié)及理解

一. 干嘛的,舉個例子

舉個簡單的例子,我們有一個需求,快速的拼接一個班級所有同學(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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容