专门化一个 Self 是通用的协议 Class

Specializing a Protocol where Self is a Generic Class

假设我有以下 Swift 类:

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

和这个协议:

protocol Zip {}

我正在尝试创建另一个协议 Zap 专门化自身,其中 SelfBar,但我想进一步要求 Bar 的泛型类型是 [=21] 的实例=] 实现 Zip.

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() 36=]

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 和你们中发表评论的人。

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

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

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