最近在看《Swifter - 100 個(gè) Swift 必備 tips》這本書。這里記錄一些思考??妓羊。首先一個(gè)就是第一個(gè)關(guān)于柯里化的绊起。這篇文章前面的還好理解腔彰,但是剛看到后面的那個(gè)例子的時(shí)候我是一臉懵逼的∩盅郑現(xiàn)在結(jié)合這個(gè)例子作者的原文來(lái)捋下思路世曾。
一個(gè)例子
class BankAccount {
var balance: Double = 0.0
func deposit(amount: Double) {
balance += amount
}
}
這個(gè)例子定義了一個(gè)擁有一個(gè)屬性和一個(gè)方法的類,一般來(lái)說(shuō)調(diào)用方法是這樣的
let account = BankAccount()
account.deposit(100) // balance is now 100
但是我們也可以這樣調(diào)用
let depositor = BankAccount.deposit
depositor(account)(100) // balance is now 200
這里的depositor這個(gè)變量的類型就是(BankAccount) -> (Double) -> ()
它表示一個(gè)函數(shù)谴咸,這個(gè)函數(shù)接收一個(gè)BankAccount實(shí)例返回另外一個(gè)函數(shù)轮听。返回的這個(gè)函數(shù)類型是(Double) -> ()
總結(jié)
看過(guò)上面的例子就能理解書中最后的那個(gè)例子
struct TargetActionWrapper<T: AnyObject> : TargetAction {
weak var target: T?
let action: (T) -> () -> ()
func performAction() -> () {
if let t = target {
action(t)()
}
}
}
這個(gè)結(jié)構(gòu)體中action代表的就是一個(gè)函數(shù),它接收一個(gè)實(shí)例返回一個(gè)函數(shù)寿冕。在執(zhí)行的時(shí)候傳入target蕊程,執(zhí)行target的一個(gè)方法。
另外
在swift3中蘋果對(duì)Selector進(jìn)行了優(yōu)化驼唱,提供了新的生成Selector的方法,并且是在編譯時(shí)創(chuàng)建的驹暑,編譯器可以檢查方法或?qū)傩缘拇嬖凇?/p>
class MyViewController {
let button = UIButton()
func viewDidLoad() {
let action = #selector(MyViewController.onButtonTap)
button.addTarget(self, action: action, for: .touchUpInside)
}
@objc func onButtonTap() {
print("Button was tapped")
}
}
推薦在使用中使用這種方法玫恳。而不是之前的直接用字符串創(chuàng)建selector。