在self是泛型类的情况下专门研究协议

时间:2019-10-02 14:38:02

标签: swift generics swift-protocols

说我有以下Swift类:

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

和此协议:

protocol Zip {}

我正在尝试创建另一个协议Zap,该协议专门针对SelfBar的地方,但是我想进一步要求Bar的泛型类型是Foo的实例实现Zip

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

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

有没有一种方法可以使用Swift泛型?

预先感谢您的帮助。


编辑-预期用途:

对此感到困惑,我深表歉意,但希望它能表明我正在尝试做的事情。

Bar引用了Foo的实例,协议Zip具有函数diddle,而Zap具有函数daddle

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

protocol Zip {
  func diddle()
}

protocol Zap {
  func daddle()
}

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

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

1 个答案:

答案 0 :(得分:1)

不知道任何其他详细信息。如果目标是Zap仅接受继承Bar并符合Foo的类型的Zip ...那么这样的话:

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

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