Swift 3: делегат в TapGestureRecognizer в Generics не вызван

У меня есть такой протокол:

public  protocol SubmitAgeDelegate : class  {
func changeSubmitButtonBool()
}

Проблема заключается в том, что я хочу назвать его в классе generics.

open class GenericController<UICollectionViewCell,UICollectionReusableView> {

weak var submitAgeDelegate: SubmitAgeDelegate? 

Внутри UITapGestureRecognizer

func tapGestureDidRecognize(_ gesture: UITapGestureRecognizer) {

    if let myAgeDelegate = self.submitAgeDelegate {
        print("inside delegate")   //Never gets inside
        myAgeDelegate.changeSubmitButtonBool() 
    }

}

Не слишком уверен, почему он никогда не называется? Подобные способы работали в обычных классах с функциями IBAction.

В моем другом классе:

open class MyCell: ActionCell, SubmitAgeDelegate {
weak var submitAgeDelegate: SubmitAgeDelegate?    

public override init(frame: CGRect) {
    super.init(frame: frame)
    submitAgeDelegate  = self
    initialize()
}

// Delegate 
public func changeSubmitButtonBool(){

    print("called ")
}

Ответ 1

Вы никогда не устанавливаете submitAgeDelegate для GenericController. Наличие члена с тем же именем в вашем классе MyCell не помогает.

Вам нужно получить ссылку на ваш GenericController, чтобы установить его делегат; там нет способа обойти это. (Это не имеет ничего общего с дженериками, это то же самое для не-общих классов.) Поскольку похоже, что вы используете его как UICollectionViewCell, вы можете использовать ссылку, которую вы делаете в tableView:cellForRowAtIndexPath: или аналогично.