最近在看《Swifter - 100 个 Swift 必备 tips》这本书。这里记录一些思考🤔。首先一个就是第一个关于柯里化的。这篇文章前面的还好理解,但是刚看到后面的那个例子的时候我是一脸懵逼的。现在结合这个例子作者的原文来捋下思路。
一个例子
class BankAccount {
var balance: Double = 0.0
func deposit(amount: Double) {
balance += amount
}
}
这个例子定义了一个拥有一个属性和一个方法的类,一般来说调用方法是这样的
let account = BankAccount()
account.deposit(100) // balance is now 100
但是我们也可以这样调用
let depositor = BankAccount.deposit
depositor(account)(100) // balance is now 200
这里的depositor这个变量的类型就是(BankAccount) -> (Double) -> ()
它表示一个函数,这个函数接收一个BankAccount实例返回另外一个函数。返回的这个函数类型是(Double) -> ()
总结
看过上面的例子就能理解书中最后的那个例子
struct TargetActionWrapper<T: AnyObject> : TargetAction {
weak var target: T?
let action: (T) -> () -> ()
func performAction() -> () {
if let t = target {
action(t)()
}
}
}
这个结构体中action代表的就是一个函数,它接收一个实例返回一个函数。在执行的时候传入target,执行target的一个方法。
另外
在swift3中苹果对Selector进行了优化,提供了新的生成Selector的方法,并且是在编译时创建的,编译器可以检查方法或属性的存在。
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")
}
}
推荐在使用中使用这种方法。而不是之前的直接用字符串创建selector。