使用Swift协议包装回调类型

时间:2015-10-24 08:35:14

标签: swift swift-protocols

假设我正在处理一个我无法控制的库,我正在尝试包装一个定义回调类型的类,以便为了测试目的而解耦我的代码。这是类,内部模块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 {}

我得类型'应用'不符合协议'ApplicationProtocol'。如果我将ApplicationProtocol回调中的UIElementProtocol更改回UIElement,则可以正常工作。但是UIElement符合UIElementProtocol,那么为什么这不起作用?

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

1 个答案:

答案 0 :(得分:0)

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

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

Callback是预期的类型。显然,您必须明确将常规函数类型作为更具体的类型传递。