【问题标题】:Swift protocol oriented programming one protocol inherit others and one of them implement methodSwift 面向协议的编程一种协议继承其他协议,其中一种实现方法
【发布时间】:2020-07-09 14:05:45
【问题描述】:

我有这样的协议

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

如果它也是 IRouter,我将默认实现添加到 Requestable

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 没有检测到错误

【问题讨论】:

    标签: swift protocol-oriented


    【解决方案1】:

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

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

    问题是IRouter 是一个协议,它继承了RequestableMultipartUploading。因此,您可以用一个扩展名替换这两个扩展名。

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

    它也应该可以解决您的问题。

    【讨论】:

    • 是的,但我考虑为什么这不起作用,因为当我在我的框架内测试相同的代码时它工作正常。那里我有Router 和RouterTests 目标和相同的协议,然后我定义MockRouter 不定义此方法asURLRequest() 和multipartFormData() 并测试它们是否将Router 属性转换为有效结果URLRequest 或Data?并且单元测试有效,MockRouter 并没有抱怨没有实现上述方法。我可以按照您的建议进行替换,但我想知道为什么它不起作用,因为我认为它应该起作用
    • 好的,我再次检查了它,它可以工作,但问题是我没有向 github 存储库添加标签,即使我认为它已更新,Xcode 也不会刷新它的框架依赖项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多