Быстрое программирование, ориентированное на протокол, один протокол наследует другие, а один из них реализует метод - PullRequest
0 голосов
/ 09 июля 2020

У меня есть такие протоколы

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
    }
}

Но тогда, если я импортирую модуль в приложение target и do

enum Router: IRouter {  }

Он не содержит эту реализацию multipartFormData и asUrlRequest, и мне нужно реализовать их снова? как избежать этого и использовать эти реализации по умолчанию. Кажется, если я сделаю это в том же модуле (цели), тогда Router: IRouter не жалуется, но, возможно, это просто Xcode, не обнаруживающий ошибку

1 Ответ

1 голос
/ 09 июля 2020

Эти расширения выглядят избыточными.

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

Дело в том, что IRouter - это протокол, наследующий как Requestable, так и MultipartUploading. Таким образом, вы можете заменить оба расширения одним.

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

Это также должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...