【发布时间】:2019-10-02 14:38:02
【问题描述】:
假设我有以下Swift 类:
class Foo {}
class Bar<T: Foo> {}
还有这个协议:
protocol Zip {}
我正在尝试创建另一个协议Zap,它专门用于Self 是Bar,但我想进一步要求Bar 的泛型类型是实现Foo 的Foo 的实例@。
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 的扩展中提供一个默认实现,以便在从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 & Zip不是Foo的子类的问题 -
遗憾的是这是不可能的。您不能创建这样的泛型类型限制,因为您需要提供泛型类型
Self的提取专用版本。如果您只想在Zap协议中专门化一些特定的通用函数,那是可能的。 -
这个设计看起来有点奇怪,你能告诉我们你想用它实现什么吗?也许我们可以找到另一个解决方案。否则我们可能会遇到XY problem。
-
我在帖子中添加了更多信息。
标签: swift generics swift-protocols