2017-04-19 5 views
1

Je travaille actuellement sur la création d'une classe UIView personnalisée pour une application sur laquelle je travaille, et elle nécessite que vous passiez un vide qui sera exécuté lors de l'événement de tap UIView. Ce que je dois être en mesure de faire, est de prendre la fonction qui a été passée à la fonction init(), et de le stocker afin qu'il puisse être appelé plus tard. Le code sur lequel je travaille actuellement ressemble à ceci:Passage de la fonction à la variable afin qu'elle puisse être appelée plus tard

class CustomUIView: UIView { 

    private var _tapListener : Void; 

    init (tapListener:() -> Void){ 
     //Attempt to set _tapListener variable as tap listener does not work :(
     _tapListener = tapListener(); 
     //Right now it just executes the function :(
     let listener = UITapGestureRecognizer(target: self, action: #selector(callFunction)); 
     self.addGestureRecognizer(listener) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func callFunction() { 
     //Call the function here 
     _tapListener(); 
    } 
} 

Comment est-ce possible d'accomplir ce que j'essaye de faire ici?

Toute aide est grandement appréciée

+0

Parce que le type de votre 'private var _tapListener' est faux. – matt

Répondre

1

Pensez à utiliser les fermetures:

typealias tapListenerClosure =() -> Void 

class CustomUIView: UIView { 

    var tapClosure: tapListenerClosure 

    init (tap: @escaping tapListenerClosure) { 
     self.tapClosure = tap 
     super.init(.... 
     let listener = UITapGestureRecognizer(target: self, action: #selector(callFunction)); 
     self.addGestureRecognizer(listener) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func callFunction() { 
     //Call the function here 
     self.tapClosure() 
    } 
} 
+2

Votre signature '_tapListener' est incorrecte. Il a le type Void. – Brandon

+0

@Brandon merci de le signaler. Edité et supprimé ce ivar inutilisé. – janusbalatbat

+0

C'est une très bonne réponse détaillée. Merci! –

2

définir simplement votre variable d'instance de la même manière que l'argument init:

private var _tapListener:() -> Void 
+0

Ceci est une solution vraiment simple! On dirait que j'ai un peu de lecture à faire sur ce que les fermetures sont vraiment. –