0

假设我正在处理一个我无法控制的库,并且我正在尝试包装一个定义回调类型的类,以解耦我的代码以进行测试。这是模块内部的类AXSwift

public class Application {
  public typealias Callback = (element: UIElement) -> ()
  public func createObserver(callback: Callback) -> Observer? {
    // ...
  }
}

这是用于测试的包装协议:

protocol UIElementProtocol {}
extension AXSwift.UIElement: UIElementProtocol {}

protocol ApplicationProtocol {
  func createObserver(callback: (element: UIElementProtocol) -> ()) -> Observer?
}
extension AXSwift.Application: ApplicationProtocol {}

我得到Type 'Application' does not conform to protocol 'ApplicationProtocol'。如果我UIElementProtocol在 ApplicationProtocol 回调中更改回UIElement,它可以工作。但是UIElement符合UIElementProtocol,那么为什么这不起作用呢?

第二个问题:有没有更好的方法来设计库 API 以允许这种事情?

4

1 回答 1

0

解决方案非常简单,只需在扩展中使用调用原始方法的方法实现协议即可:

extension AXSwift.Application: ApplicationProtocol {
  func createObserver(callback: (element: UIElementProtocol) -> ()) -> Observer? {
    return createObserver(callback as Callback)
  }
}

Callback预期类型在哪里。显然,您必须明确将通用函数类型作为更具体的类型传递。

于 2015-10-24T21:28:58.467 回答