使用当前 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 相同,除了它们的关联模型对象。所以BaseEventJumpEvent改为:

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。