2015-03-03 8 views
0

La recherche rapide pour cette question ne m'a rien donné. En même temps, c'est difficile à expliquer, je suppose que tout est clair à partir de cette méthode. Jetez un oeil à cela, s'il vous plaît:Comment passer dans l'objet qui prend délégué

func tap(sender: AnyObject, action: Selector) -> UITapGestureRecognizer { 
     let tap = UITapGestureRecognizer(target: sender, action: action) 
     tap.delegate = sender 
     return tap 
    } 

Erreur:

Type 'AnyObject' does not conform to protocol 'UIGestureRecognizerDelegate' 

La question est ce besoin d'écrire supplémentaire pour AnyObject pour éviter de faire passer ce message? Ou d'autres moyens?

+3

Qu'est-ce qui ne va pas dans l'écriture directe de cette partie de code au lieu de faire une capture d'écran? –

+0

Modifié. C'était plus rapide à comprendre que maintenant. La réponse est simple je crois. – Michael

Répondre

1

En supposant que sender est toujours de type UIGestureRecognizerDelegate vous pouvez utiliser une force baissés:

tap.delegate = sender as UIGestureRecognizerDelegate 

Sinon, utilisez un casting défaut:

if let delegate = sender as? UIGestureRecognizerDelegate 
{ 
    tap.delegate = delegate 
} 

Comme référence, un coup d'oeil à Type Casting for Any and AnyObject contenu dans le guide du langage de programmation Swift. Notez que, pour moi, ce style d'assignation du délégué semble inhabituel et sujet aux erreurs.

+0

Merci, ne savait pas à ce sujet. C'était juste pour éviter la duplication du code. J'ai beaucoup de vues qui utilisent cette méthode. Merci – Michael

+0

Je voulais juste dire, qu'il pourrait y avoir une alternative;) –

+1

une autre solution: func tap (expéditeur: UIGestureRecognizerDelegate, action: Selector) -> UITapGestureRecognizer {...} – LoVo