面向Swift协议的编程一种协议继承另一种协议,另一种协议实现方法

面向Swift协议的编程一种协议继承另一种协议,另一种协议实现方法,swift,protocol-oriented,Swift,Protocol Oriented,我有这样的协议 public protocol IRouter: Requestable, MultipartUploading, Encoder { } 其中IRouter应继承或符合可请求协议和编码器协议 public protocol Requestable { func asURLRequest() throws -> URLRequest } 多端口加载是另一个默认实现的协议 public protocol MultipartUploading {

我有这样的协议

public protocol IRouter: Requestable, MultipartUploading, Encoder {

}
其中IRouter应继承或符合可请求协议和编码器协议

public protocol Requestable {
    
    func asURLRequest() throws -> URLRequest
}
多端口加载是另一个默认实现的协议

public protocol MultipartUploading {
        
        func multipartFormData() throws -> Data?
    }
    
    public extension MultipartUploading {
        func multipartFormData() throws -> Data? { return nil }
    }
然后我将默认实现添加到Requestable,如果它也是IRouter

public extension Requestable where Self: IRouter {
    
    func asURLRequest() throws -> URLRequest {
      // make url request
    }

}
以及多端口协议的另一个实现

public extension MultipartUploading where Self: IRouter {
    
    func multipartFormData() -> Data? {
      // make data to upload
    }
}
但若我将模块导入到应用程序目标并执行

enum Router: IRouter {  }
它不包含此multipartFormData和asUrlRequest实现,我是否需要再次实现它们?如何避免这种情况,并拥有这种默认实现。
如果我在同一个模块(目标)中执行此操作,那么Router:IRouter不会抱怨,但可能只是Xcode没有检测到错误,这个扩展看起来是多余的

public extension Requestable where Self: IRouter
public extension MultipartUploading where Self: IRouter
问题是,
IRouter
是一个协议,它继承了
可请求的
多端口加载
。因此,您可以用一个扩展替换两个扩展

public extension IRouter {
    func asURLRequest() throws -> URLRequest {
      // make url request
    }
    func multipartFormData() -> Data? {
      // make data to upload
    }
}

它也应该修复你的问题。

是的,但是我考虑为什么这不起作用,因为当我在框架中测试同一代码时,它工作正常。在那里,我有路由器和路由器测试目标以及相同的协议,然后我定义MockRouter不定义此方法asURLRequest()和multipartFormData(),并测试它们是否将路由器属性转换为有效的结果URLRequest或数据?单元测试可以工作,MockRouter并没有抱怨没有实现上述方法。我可以按照您的建议进行替换,但我想知道为什么它不能正常工作我认为应该正常工作我再次检查了它,它正常工作,但问题是我没有向github存储库添加标记,即使我认为它已更新,Xcode也不会刷新其框架依赖项