通用

时间:2017-03-29 20:00:08

标签: swift generics

我正在研究Swift中的事件类。我们的想法是,您可以以防止保留周期的方式添加处理程序。例如:

let myEvent = Event<String>()
myEvent.addHandler(self, MyClass.handleMyEvent)

稍后我将添加+=运算符等。

我有以下代码:

class Event<Arg> {
  private var handlers = [EventHandler<AnyObject, Arg>]()

  func addHandler<Target: AnyObject>(_ target: Target, _ method: @escaping (Target) -> (Arg) -> Void ) {
    queue.async { [weak self] in
      guard let me = self else { return }
      let handler = EventHandler(target: target, method: method)
      me.handlers.append(handler)
    }
  }
}

struct EventHandler<Target: AnyObject, Arg> {
  weak var target: Target?
  var method: (Target) -> (Arg) -> Void
}

上面的代码无法编译。 Swift编译器引发以下错误:

compiler error

  

无法转换'EventHandler&lt; Target,Arg&gt;'类型的值预期参数类型'EventHandler&lt; AnyObject,_&gt;'

编译器似乎不理解(Target) -> (Arg) -> Void可以隐式转换为(AnyObject) -> (Arg) -> Void。我可以通过更改处理程序的创建方式来修复代码:

let handler = EventHandler(target: target, method: method as! (AnyObject) -> (Arg) -> Void)

但显然演员是必要的,这似乎很奇怪。

有什么想法吗?或者有关如何改进代码的建议?

0 个答案:

没有答案