[RESOLU][Swift]Utiliser une closure @escaping pour passer un paramètre
On peut utiliser une closure @escaping pour transmettre un événement à un ViewController, par exemple la fin d'un traitement.
a
class MonObjet {
init(closure: @escaping ()->Void) {
// Traitements divers
// ....
closure()
}
}
a
Utilisation :
a
class ViewController: UIViewController {
var monObjet:MonObjet?
override func viewDidLoad() {
super.viewDidLoad()
monObjet = MonObjet(closure: { self.notificationFinOperation() })
}
func notificationFinOperation() {
print ("Le traitement est terminé")
// Destruction objet
monObjet = nil
}
}
a
Je me demande s'il y a un moyen de transmettre un paramètre au ViewController, de telle manière que la fonction de notification puisse s'écrire :
a
func notificationFinOperation(valeur:Int) {
print (" Valeur de retour : " , valeur)
// Destruction objet
monObjet = nil
}
a
La seule solution que j'ai trouvé pour l'instant est d'associer une variable à la classe MonObjet.
a
class MonObjet {
var valeur = 0
init(closure: @escaping ()->Void) {
// Traitements divers
// ....
valeur = 153
closure()
}
}
a
Et de lire son contenu lors de l'appel de la closure.
a
func notificationFinOperation() {
print ("Le traitement est terminé ")
if let valeur = monObjet.valeur {
print (" Valeur de retour : " , valeur)
}
// Destruction objet
monObjet = nil
}
a
Mais je trouve que ce n'est pas propre a cause de l'optionnal. Ce serait plus lisible si la notification recevait directement la valeur en paramètre.
t
func notificationFinOperation(valeur:Int) {
}
t
Une suggestion pour y arriver ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
T'es pas doué, Draken. C'est facile :
Il suffisait de s'appuyer sur un exemple concret fourni par Apple, non ?
Notamment tous ces blocks @escaping (souvent nommés completionHandler) comme dans un URLSession ?
Tu sais que tu peux faire moins de code pour ça ?
L'objectif n'est pas d'afficher une valeur, mais d'envoyer des notifications à une fonction du ViewController, via une closure. En lisant ton exemple, je présume que l'on peut l'écrire comme ça :
a
a
Correct ?
Je n'ai rien trouvé de convainquant en faisant une recherche sur internet. Et mon niveau d'anglais était .. euh .. ce qu'il est, ce n'est pas gagné. Enfin j'ai quand même fini par trouver.
Oui, et non ::)
Le closure est déjà une fonction du viewController qui peut accéder n'importe quel membre de la classe.
Si tu n'as pas besoin d'appeler la fonction d'ailleurs, le closure suffirait.
>:(
Je comprend le sens des mots, pas les phrases complètes. Un petit exemple en code, SVP, sur la meilleure manière de faire pour que la fonction jeRecoisUneNotification() du ViewController reçoive une valeur d'un objet à travers d'une closure ?
a