2015-10-24 96 views
0

假设我正在处理一个我不控制的库,并且我试图包装一个类,该类定义了一个回调类型来解耦我的代码以用于测试目的。这里的类,内部模块AXSwift用Swift协议包装回调类型

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回调中的UIElementProtocol更改回UIElement,它就可以工作。但UIElement符合UIElementProtocol,那么为什么不工作?

第二个问题:是否有更好的方法来设计库API来支持这种事情?

回答

0

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

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

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