使用当前 class 作为类型约束
Use current class as type constraint
我想在我的 class 上有一个方便的方法,就像这样:
class BaseEvent {
class func on(executionHandler: (BaseEvent -> Void)) -> Handler<BaseEvent> {
return Handler<BaseEvent>(executionHandler: executionHandler)
}
}
这有一个缺点,即执行处理程序没有 BaseEvent
的子 class 的正确类型。想象一下,我有一个名为 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)
}
请注意,return 类型 (Handler<BaseEvent>
) 不是很重要,只是执行处理程序的类型。
我目前的"solution"如下,需要手动重新定义subclasses中的方法,明显不太理想:
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)
}
}
如果需要更多信息,请告诉我。
谢谢,
诺亚
我最终重新考虑了我的实现并使用泛型实现了预期的结果。这可能不适用于所有用例,但它对我的用例很有效,因为子 class 与基本 class 相同,除了它们的关联模型对象。所以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
一样重用功能,还有一个好处是我不需要为每个模型对象创建一个新的子class。
我想在我的 class 上有一个方便的方法,就像这样:
class BaseEvent {
class func on(executionHandler: (BaseEvent -> Void)) -> Handler<BaseEvent> {
return Handler<BaseEvent>(executionHandler: executionHandler)
}
}
这有一个缺点,即执行处理程序没有 BaseEvent
的子 class 的正确类型。想象一下,我有一个名为 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)
}
请注意,return 类型 (Handler<BaseEvent>
) 不是很重要,只是执行处理程序的类型。
我目前的"solution"如下,需要手动重新定义subclasses中的方法,明显不太理想:
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)
}
}
如果需要更多信息,请告诉我。
谢谢, 诺亚
我最终重新考虑了我的实现并使用泛型实现了预期的结果。这可能不适用于所有用例,但它对我的用例很有效,因为子 class 与基本 class 相同,除了它们的关联模型对象。所以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
一样重用功能,还有一个好处是我不需要为每个模型对象创建一个新的子class。