2017-10-03 17 views
1

私は代理プロトコルに準拠したジェネリッククラスを持っています。私はプロトコルのメソッドで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

チェック、トピックでは、任意のようなプロトコルのパラメータを作れば – Andrea

+0

かなり広いとは何か?私はこのように意味する:func doit(マネージャー:Any?)。その後、それをアンラップすることができます。 – Woof

答えて

0

ジェネリッククラスの宣言の間には、それらのいずれかを単一の関数に渡すための共通性が必要です。これは、すべてのジェネリック型のクラスがサポートする(たとえば、ベースクラスの)プロトコルを宣言することで実現できます。ここで

は例です:Googleでスウィフトで型消去について

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

}