聲明
本文是本人翻譯的國外的文章Instance Methods are Curried Functions in Swift。英文水平有限,有翻譯錯誤的地方,還望大家指出。
正文
在Swift方法中,實例化方法只是一種以實例作為參數的類型方法,它返回一個即將被應用到實例中的函數。
最近我學習了關于Swift的特性,出乎我意料的是:實例方法是以實例作為第一個參數的柯里化函數。什么是柯里化函數呢?
(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
}
}
我們可以創建該類的實例并調用實例方法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
上述的調用是完全等價的,這是為什么呢?我們首先將該方法分配給一個變量。需要注意的是括號后面的BankAccount.deposit-我們不調用這個方法(這將產生一個錯誤,因為你不能調用類型上的實例方法),僅僅是引用它,更像是C語言里面的指針。第二步是調用函數存儲在存儲變量中。其類型如下:
let depositor: BankAccount -> Double -> ()
換言之,這個函數有一個參數,這個參數是銀行賬戶類的實例,返回了另一個函數。后面的方法接收一個Double類型的變量并直接return。在第二部分,你應該能夠識別出deposit()實例方法的簽名。
我希望您可以知道的是:Swift的實例方法只是一種以實例作為參數的類型方法,并返回一個將被應用到實例中的函數。當然,我們也可以把這些都放在一行來做,這使的類型方法和實例方法之間的關系更加清晰:
BankAccount.deposit(account)(100)
print(account.balance)//300
通過實例BankAccount.deposit(),這個實例方法被綁定到實例函數。在第二個步中,該函數將與其他參數一起被調用。這樣會很酷,對吧?
看后感
之前自己對柯里化函數了解過,還寫過一篇自己對柯里化的理解:Swift新特性之柯里化函數一次偶然在網上查看資料的時候看見這個標題:Instance Methods are Curried Functions in Swift,就覺得很有趣。因為是菜鳥,之前自己開發的時候接觸類的實例化方法的時候從來沒想過它會和柯里化函數有聯系。總之:漲知識了。