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<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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 由于种种原因,简书等第三方平台博客不再保证能够同步更新,欢迎移步 GitHub:https://github.co...
    萌面大道阅读 36,164评论 19 30
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,826评论 0 9
  • SEL 与 @selector 在 Objective-C 中我们可以使用 @selector 将一个方法转换并赋...
    Inlight先森阅读 9,621评论 0 4
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,712评论 33 466
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,390评论 19 139