我们可以产生这样后续的协议:
protocol SomeDelegate {
typealias T
func xxx(x: T)
}
并使一些类符合它:
class AA: SomeDelegate {
typealias T = Int
func xxx(x: T) {
// do some thing
}
}
我的问题是如何声明某些属性符合生成协议,如下所示:
class BB {
var delegate: SomeDelegate
}
上面的代码将引发错误:
Protocol 'SomeDelegate' can only be used as a generic constraint
because it has Self or associated type requirements
看来我可以将协议用作委托,如下所示:
class BB {
var delegate: AA?
}
但是,这不是我想要的,这将导致我的委托无法继承其他父类
最佳答案
您可以使用泛型,将SomeDelegate
用作类型约束:
class BB <U : SomeDelegate> {
var delegate: U? = nil
}
这样,您只需在初始化
U
的实例时提供BB
的类型:struct MyStruct : SomeDelegate {
// The argument of xxx needs to be a concrete type here.
func xxx(x: Int) {
// ...
}
}
let bb = BB<MyStruct>()