专门化一个 Self 是通用的协议 Class
Specializing a Protocol where Self is a Generic Class
假设我有以下 Swift
类:
class Foo {}
class Bar<T: Foo> {}
和这个协议:
protocol Zip {}
我正在尝试创建另一个协议 Zap
专门化自身,其中 Self
是 Bar
,但我想进一步要求 Bar 的泛型类型是 [=21] 的实例=] 实现 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
的扩展中提供一个默认实现,以便在从 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> {}
假设我有以下 Swift
类:
class Foo {}
class Bar<T: Foo> {}
和这个协议:
protocol Zip {}
我正在尝试创建另一个协议 Zap
专门化自身,其中 Self
是 Bar
,但我想进一步要求 Bar 的泛型类型是 [=21] 的实例=] 实现 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
的扩展中提供一个默认实现,以便在从 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> {}