聲明
本文是本人翻譯的國外的文章Instance Methods are Curried Functions in Swift构回。英文水平有限延塑,有翻譯錯誤的地方,還望大家指出箍土。
正文
在Swift方法中养涮,實例化方法只是一種以實例作為參數(shù)的類型方法葵硕,它返回一個即將被應(yīng)用到實例中的函數(shù)眉抬。
最近我學(xué)習(xí)了關(guān)于Swift的特性,出乎我意料的是:實例方法是以實例作為第一個參數(shù)的柯里化函數(shù)懈凹。什么是柯里化函數(shù)呢?
(ps:引用的話就不翻譯了)
The basic idea behind currying is that a function can be partially applied, meaning that some of its parameter values can be specified (bound) before the function is called. Partial function application yields a new function.
Example
思考一個表示銀行賬戶的類的簡單例子:
class BankAccount {
var balance: Double = 0.0
func deposit(amount: Double) {
balance += amount
}
}
我們可以創(chuàng)建該類的實例并調(diào)用實例方法deposit() :
let account = BankAccount()//BankAccount
account.deposit(100)//BankAccount
print(account.balance)//100
到目前為止蜀变,一切都是很簡單的,我們還可以這樣做:
let depositor = BankAccount.deposit//BankAccount -> Double->()
depositor(account)(100)
print(account.balance)//200
上述的調(diào)用是完全等價的介评,這是為什么呢库北?我們首先將該方法分配給一個變量。需要注意的是括號后面的BankAccount.deposit-我們不調(diào)用這個方法(這將產(chǎn)生一個錯誤们陆,因為你不能調(diào)用類型上的實例方法)寒瓦,僅僅是引用它,更像是C語言里面的指針坪仇。第二步是調(diào)用函數(shù)存儲在存儲變量中杂腰。其類型如下:
let depositor: BankAccount -> Double -> ()
換言之,這個函數(shù)有一個參數(shù)椅文,這個參數(shù)是銀行賬戶類的實例喂很,返回了另一個函數(shù)。后面的方法接收一個Double類型的變量并直接return皆刺。在第二部分少辣,你應(yīng)該能夠識別出deposit()實例方法的簽名。
我希望您可以知道的是:Swift的實例方法只是一種以實例作為參數(shù)的類型方法羡蛾,并返回一個將被應(yīng)用到實例中的函數(shù)漓帅。當(dāng)然,我們也可以把這些都放在一行來做林说,這使的類型方法和實例方法之間的關(guān)系更加清晰:
BankAccount.deposit(account)(100)
print(account.balance)//300
通過實例BankAccount.deposit()煎殷,這個實例方法被綁定到實例函數(shù)屯伞。在第二個步中腿箩,該函數(shù)將與其他參數(shù)一起被調(diào)用。這樣會很酷劣摇,對吧珠移?
看后感
之前自己對柯里化函數(shù)了解過,還寫過一篇自己對柯里化的理解:Swift新特性之柯里化函數(shù)一次偶然在網(wǎng)上查看資料的時候看見這個標(biāo)題:Instance Methods are Curried Functions in Swift末融,就覺得很有趣钧惧。因為是菜鳥,之前自己開發(fā)的時候接觸類的實例化方法的時候從來沒想過它會和柯里化函數(shù)有聯(lián)系勾习∨ǖ桑總之:漲知識了。