我想在我的类上有一个像这样的便捷方法:
class BaseEvent {
class func on(executionHandler: (BaseEvent -> Void)) -> Handler<BaseEvent> {
return Handler<BaseEvent>(executionHandler: executionHandler)
}
}
这有一个缺点,即执行处理程序对于 BaseEvent
的子类没有正确的类型.想象一下,我有一个名为 JumpEvent
的类(class)源自 BaseEvent
,在理想的世界中,我将能够执行以下操作:
let handler = JumpEvent.on { event in
//Do something with jump event
}
不幸的是事件的类型是BaseEvent
并且必须感到沮丧。
我尝试了以下方法,但没有成功:
class func on(executionHandler: (Self -> Void)) -> Handler<BaseEvent> {
return Handler<BaseEvent>(executionHandler: executionHandler)
}
class func on<T: Self>(executionHandler: (T -> Void)) -> Handler<BaseEvent> {
return Handler<BaseEvent>(executionHandler: executionHandler)
}
请注意,返回类型 ( Handler<BaseEvent>
) 不是很重要,重要的是执行处理程序的类型。
我目前的“解决方案”如下,它需要手动重新定义子类中的方法,这显然不太理想:
class BaseEvent {
class func on<T: BaseEvent>(executionHandler: (T -> Void)) -> Handler<T> {
return Handler<T>(executionHandler: executionHandler)
}
}
class JumpEvent: BaseEvent {
override class func on<T: JumpEvent>(executionHandler: (T -> Void)) -> Handler<T> {
return super.on(executionHandler)
}
}
如果需要其他信息,请告诉我。
谢谢, 诺亚
最佳答案
我最终重新考虑了我的实现并使用泛型实现了预期的结果。这可能不适用于所有用例,但它对我的用例很有效,因为除了它们的关联模型对象之外,子类与基类相同。所以 BaseEvent
和 JumpEvent
改为:
protocol ModelType {
}
class Jump: ModelType {
}
class Event<T: ModelType> {
class func on(executionHandler: (Event<T> -> Void)) -> Handler<T> {
return Handler<T>(executionHandler: executionHandler)
}
}
这让我可以像使用 BaseEvent
一样重用功能,还有一个好处是我不需要为每个模型对象创建一个新的子类。
关于ios - 使用当前类作为类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28181252/