【问题标题】:Delegate or closure for multiple event in same object同一对象中多个事件的委托或关闭
【发布时间】:2019-02-20 11:27:58
【问题描述】:

var tableView: MyTableView?
tableView?.onGoToA = {
    self.goToA()
}
tableView?.onGoToB = {
    self.goToB()
}
tableView?.onGoToC = {
    self.goToC()
}

对于这种情况有更好的方法还是只使用委托更好的方法?

【问题讨论】:

  • 请添加更多上下文和尝试做什么
  • 我认为 OP 想知道当一个对象可以发送多个事件时是否应该使用委托或闭包
  • 离题,不要在swift代码中使用;
  • 如何使用相同的闭包但返回一个参数。 tableView.onGo = { [weak self] item in guard let strongSelf = self else {return} strongSelf.goTo(item) }func goTo(_ item: "whatever the item type is") { // Do the go logic here }
  • 事情都是一样的,只是实现它的一种方式,如果你在 cellforRowAt 中使用闭包和委托,你应该注意自我强硬,注意保持周期!!!

标签: ios swift design-patterns delegates closures


【解决方案1】:

如果你有有限的可能情况,我将有一个以枚举作为参数的闭包,并将有一个 switch case 来决定触发哪个方法

如果每个事件都有一个与之关联的值,您也可以利用具有关联值的枚举 :)

例子:

enum EventType {
    case toA
    case toB
    case toC
}

声明你的闭包为

var routerBlock: ((EventType) -> ())? = nil

终于将路由器块实现为

tableView?.routerBlock = {[weak self] (eventType) in
            switch eventType {
            case .toA:
                self?.gotoA()
            case .toB:
                self?.goToB()
            case .toC:
                self?.goToC()
            }
        }

您也可以对委托使用类似的方法。除了拥有 3 个委托方法之外,您还可以拥有一个采用 EventType 的方法并使用相同的 switch 块来决定触发哪个方法

希望对你有帮助

【讨论】:

  • @luhuiya : 欢迎 :) 如果您认为它有用、愉快的编码,请考虑接受答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多