假设我正在处理一个我无法控制的库,我正在尝试包装一个定义回调类型的类,以便为了测试目的而解耦我的代码。这是类,内部模块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以允许这类事情?
答案 0 :(得分:0)
解决方案非常简单,只需使用调用原始方法的方法在扩展中实现协议:
extension AXSwift.Application: ApplicationProtocol {
func createObserver(callback: (element: UIElementProtocol) -> ()) -> Observer? {
return createObserver(callback as Callback)
}
}
Callback
是预期的类型。显然,您必须明确将常规函数类型作为更具体的类型传递。