【问题标题】:Specializing a Protocol where Self is a Generic Class特化 Self 是泛型类的协议
【发布时间】:2019-10-02 14:38:02
【问题描述】:

假设我有以下Swift 类:

class Foo {}
class Bar<T: Foo> {}

还有这个协议:

protocol Zip {}

我正在尝试创建另一个协议Zap,它专门用于SelfBar,但我想进一步要求Bar 的泛型类型是实现FooFoo 的实例@。

protocol Zap where Self: Bar<Foo & Zip> {}

这会导致错误指出FooZip 都必须继承自Foo

有没有办法使用 Swift 泛型来做到这一点?

提前感谢您的帮助。


编辑 - 预期用途:

如果这令人困惑,我深表歉意,但希望它表明了我正在尝试做的事情。

假设Bar 引用了Foo 的实例,协议Zip 有一个函数diddleZap 有一个函数daddle

class Bar<T: Foo> {
  var foo: T
}

protocol Zip {
  func diddle()
}

protocol Zap {
  func daddle()
}

我要做的是在Zap 的扩展中提供一个默认实现,以便在从Bar 调用daddle() 时调用函数diddle()

extension Zap where Self: Bar<Foo & Zip> {
  func daddle(){
    foo.diddle()
  }
}

最终这可能只是糟糕的架构。

感谢您的回复。


编辑 - 可能的解决方案

这似乎可以编译,并且可能适用于我正在尝试做的事情。

class Foo {}

class Bar<T: Foo> {
    var foo: T

    init(foo: T) {
        self.foo = foo
    }
}

class FooZip: Foo, Zip {
    func diddle() {}
}

protocol Zip {
    func diddle()
}

protocol Zap where Self: Bar<FooZip> {}

extension Zap where Self: Bar<FooZip> {
    func daddle() {
        foo.diddle()
    }
}

感谢@kiril-s 和那些评论的人。

【问题讨论】:

  • 这不是泛型本身的问题,而是Foo &amp; Zip 不是Foo 的子类的问题
  • 遗憾的是这是不可能的。您不能创建这样的泛型类型限制,因为您需要提供泛型类型Self 的提取专用版本。如果您只想在 Zap 协议中专门化一些特定的通用函数,那是可能的。
  • 这个设计看起来有点奇怪,你能告诉我们你想用它实现什么吗?也许我们可以找到另一个解决方案。否则我们可能会遇到XY problem
  • 我在帖子中添加了更多信息。

标签: swift generics swift-protocols


【解决方案1】:

不知道任何其他细节。如果目标是 Zap 只接受继承 Foo 并符合 Zip 的类型的 Bar ......这样的事情怎么样:

extension Foo: Zip {}
protocol Zap where Self: Bar<Foo> {}

class FooZip: Foo, Zip {}
protocol Zap where Self: Bar<FooZip> {}

【讨论】:

  • 第二部分可能适用于我的预期目的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多