说我有以下Swift
类:
class Foo {}
class Bar<T: Foo> {}
和此协议:
protocol Zip {}
我正在尝试创建另一个协议Zap
,该协议专门针对Self
是Bar
的地方,但是我想进一步要求Bar的泛型类型是Foo
的实例实现Zip
。
protocol Zap where Self: Bar<Foo & Zip> {}
这会导致错误,指出Foo
和Zip
都必须继承自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和发表评论的人。
答案 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> {}