0

我有这样的协议

public protocol IRouter: Requestable, MultipartUploading, Encoder {

}

其中 IRouter 应该继承或符合 Requestable 和 Encoder 协议

public protocol Requestable {
    
    func asURLRequest() throws -> URLRequest
}

MultipartUploading 是另一个具有默认实现的协议

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
    }

}

以及 MultipartUploading 协议的另一种实现

public extension MultipartUploading where Self: IRouter {
    
    func multipartFormData() -> Data? {
      // make data to upload
    }
}

但是如果我将模块导入应用程序目标并执行

enum Router: IRouter {  }

它不包含这个 multipartFormData 和 asUrlRequest 实现,让我再次实现它们?如何避免这种情况并具有此默认实现。似乎如果我在同一个模块(目标)中执行此操作,那么 Router: IRouter 不会抱怨,但也许只是 Xcode 没有检测到错误

4

1 回答 1

1

这个扩展看起来是多余的。

public extension Requestable where Self: IRouter
public extension MultipartUploading where Self: IRouter

事情是IRouter一个协议,它继承了 BothRequestableMultipartUploading. 因此,您可以用一个扩展名替换这两个扩展名。

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

它还应该解决您的问题。

于 2020-07-09T14:48:06.903 回答