Swift通用协议功能与自我

时间:2017-10-03 04:25:22

标签: ios swift generics

我有一个符合委托协议的泛型类。我希望能够在协议方法中传递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

1 个答案:

答案 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)
    }

}