天天看點

Swift 柯裡化(Currying)

在計算機科學中,柯裡化(英語:Currying),又譯為卡瑞化或加裡化,是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且傳回接受餘下的參數而且傳回結果的新函數的技術。這個技術由 Christopher Strachey 以邏輯學家哈斯凱爾·加裡命名的,盡管它是 Moses Schönfinkel 和 戈特洛布·弗雷格 發明的。

------維基百科

Swift支援将方法柯裡化,類似于批量建立某個帶有固定參數的方法,就像下面這個例子,用Swift做個簡單的加法運算:

func sum(a: Int,b: Int) -> Int {

    return a + b

}

sum(1, 2)   //輸出3

建立一個柯裡化的方法很容易,雖然看起來似乎和我們以前寫的方法不太一樣,但大體來說是相似的:

Swift 柯裡化(Currying)

參數清單的每個參數都用單獨的圓括号括起來,其他部分都和以前一樣,把上面那個簡單的Swift标準方法改成柯裡化之後就像這樣:

func sum(a: Int)(b: Int) -> Int {

    return a + b

}

var sumByFirst = sum(1)

sumByFirst(b: 4) //輸出5

隻需要傳入第一個參數,傳回的sumByFirst是一個函數,它包含剩餘的其他參數,以及剛剛傳入進去的那個1,接着以它自己作為方法傳入第二個參數b就行了。

如果是三個參數就像這樣: 

func sum(a: Int)(b: Int)(c: Int) -> Int {

    return a + b + c

}

var sumByFirst = sum(1)

var sumBySecond = sumByFirst(b: 4)

sumBySecond(c: 10)  //輸出15

除了第一個參數以外,其他的參數都要顯式地寫上參數标簽,并且要按參數排列的順序調用。

一個括号中放兩個參數也可以: 

func sum(a: Int)(b: Int, c: Int) -> Int {

    return a + b + c

}

var sumByFirst = sum(1)

sumByFirst(b: 4,c: 10)  //輸出15

在某些情況下,你可能會用某個相同的參數重複調用某個方法,那麼利用柯裡化會使代碼更易于維護:

func sum(a: Int)(b: Int) -> Int {

    return a + b

}

var sumWithFive = sum(5)

sumWithFive(b: 5)

sumWithFive(b: 10)

sumWithFive(b: 15)

繼續閱讀