ios - 使用当前类作为类型约束

标签 ios swift types

我想在我的类上有一个像这样的便捷方法:

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)
  }
}

如果需要其他信息,请告诉我。

谢谢, 诺亚

最佳答案

我最终重新考虑了我的实现并使用泛型实现了预期的结果。这可能不适用于所有用例,但它对我的用例很有效,因为除了它们的关联模型对象之外,子类与基类相同。所以 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 一样重用功能,还有一个好处是我不需要为每个模型对象创建一个新的子类。

关于ios - 使用当前类作为类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28181252/

相关文章:

ios - 在 didFinishLaunchingWithOptions 中设置时 RootViewController 不响应

ios - 奇怪的 Xcode 分析结果

c++ - 具有模板化参数的模板函数的类型推断

c - C 中数字的隐式类型

c++ - 如何区分 C++ 中的模板类型

ios - UIBezierPath roundedRect 有奇怪的间隙

javascript - Navigator.share 在 iOS 中只工作一次,第二次点击会抛出错误 "request is not allowed by the user agent..."

ios - 使用 Swift 从 Firebase 读取单个值

ios - 使用按钮更改 SpriteKit 中的场景 (Swift 3)

ios - 如何使 Http 请求在 TableView 单元格之前按时加载