我正在研究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编译器引发以下错误:
无法转换'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)
但显然演员是必要的,这似乎很奇怪。
有什么想法吗?或者有关如何改进代码的建议?