【问题标题】:Extending a Protocol where Self: Generic Type in Swift (Requires Arguments In <...>)扩展 Self: Swift 中的泛型类型的协议(需要 <...> 中的参数)
【发布时间】:2015-10-26 23:25:52
【问题描述】:

我有一个类,它接受一个通用的class Collection: &lt;T: Model&gt;Model 是一个类)和一个协议(Resource),Collection 的一些子类实现:

class Collection: <T: Model> {
  typealias Callback = (result: Collection <T>) -> ()
}
protocol Resource {...}

是否可以编写一个协议扩展,其中SelfCollection 的一个实例?

尝试使用采用泛型的类来扩展协议:

extension Resource where Self: Collection {
  func fetch() {}
}

给予:

对泛型“集合”的引用需要 <...>

中的参数

尝试使用协议扩展接受泛型的类:

extension Collection where Self: Resource {
  func fetch(callback: Callback?) {}
}

给予:

'Self' 仅在协议中可用或作为类中方法的结果使用

我不确定如何继续。目标是该函数仅在符合 ResourceCollection 实例上可用。

【问题讨论】:

    标签: swift


    【解决方案1】:

    问题是Collection 是一个泛型类,所以在你声明它的每个地方,你都必须附加专门的类型,比如Collection&lt;T&gt;。但是,不能使用泛型类型指定对协议的扩展,因此您最终无法将 T 提供给 Collection

    但在您的情况下,T 被限制为 Model 类型,所以为什么不在默认协议实现中使用它:

    extension Resource where Self: Collection<Model> {
        func fetch() {
            // default implementation
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多