Swift中的selector

最近在看《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 : 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。

你可能感兴趣的:(Swift中的selector)