我有一个符合委托协议的泛型类。我希望能够在协议方法中传递self
,但我无法弄清楚如何。
protocol BodyPartManagerDelegate: class {
func doit(manager: BodyPartManager<Any>)
}
class BodyPartManager<Part> {
weak var delegate: BodyPartManagerDelegate?
var parts: [Part] = []
}
class Neck {}
class NeckManager: BodyPartManager<Neck> {
func doingit() {
delegate?.doit(manager: self)
}
}
使用上面的代码,我得到protocol 'BodyPartManagerDelegate' can only be used as a generic constraint because it has Self or associated type requirements
。如何在本协议的方法中访问self
?
答案 0 :(得分:0)
您的泛型类声明之间必须存在共性,以便允许将它们中的任何一个传递给单个函数。这可以通过声明所有通用类型类将支持的另一个协议来实现(例如在基类中)。
以下是一个例子:
protocol BodyPartManagers {} // <-- common protocol for all generic classes
protocol BodyPartManagerDelegate: class
{
func doit(manager: BodyPartManagers)
}
extension BodyPartManagerDelegate
{
func doit(manager: Self) {}
}
class BodyPartManager<Part>:BodyPartManagers // <-- this will make all generic classes compatible
{
weak var delegate: BodyPartManagerDelegate?
var parts: [Part] = []
}
class Neck {}
class NeckManager: BodyPartManager<Neck>
{
func doingit() {
delegate?.doit(manager: self)
}
}