iOS Swift Pass fermeture en tant que propriété?

Disons que j'ai un UIView personnalisé, appelons-le MyCustomView. Dans cette vue, il y a une propriété UITextField. Supposons que mon but soit de pouvoir créer une instance de MyCustomView et de l'append à un controller de vue quelque part, et je veux que ce controller de vue puisse gérer les actions effectuées sur ce champ de text. Par exemple, si je clique sur "return" sur le keyboard dans le champ de text, je pourrais vouloir faire une action – laissez-moi donner un exemple de ce que j'imagine avec un code d'objective-c psuedo:

MyCustomView *myView = [[MyCustomView alloc] initWithFrame:CGRectMake(10,10,100,100)]; myView.textField.actionBlock = { /* do stuff here! */ } [self.view addSubview:myView]; 

Et puis dans la class MyCustomView, je ferais quelque chose comme:

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { self.actionBlock(); return NO; } 

Je voudrais que customView soit l'UITextFieldDelegate afin que chaque fois que je fais ceci je n'aurai pas à append toutes les methods de délégué aux controllers de vue que je l'ajoute, mais plutôt avoir une seule implémentation qui fait juste ce que je passer à elle … Comment irait-on faire cela rapidement?

Bien sûr, vous pouvez le faire. Swift a des fonctions de première class, donc vous êtes capable de faire des choses comme passer directement des fonctions autour de variables similaires. Gardez à l'esprit, les fonctions elles-mêmes sont en fait des fermetures dans les coulisses. Voici un exemple de base:

 class MyClass { var theClosure: (() -> ())? init() { self.theClosure = aMethod } func aMethod() -> () { println("I'm here!!!") } } let instance = MyClass() if let theClosure = instance.theClosure { theClosure() } instance.theClosure = { println("Woo!") } instance.theClosure!() 

Et voici le même exemple utilisant des fermetures qui peuvent prendre un paramètre Ssortingng.

 class MyClass { var theClosure: ((someSsortingng: Ssortingng) -> ())? init() { self.theClosure = aMethod } func aMethod(aSsortingng: Ssortingng) -> () { println(aSsortingng) } } let instance = MyClass() if let theClosure = instance.theClosure { theClosure(someSsortingng: "I'm the first cool ssortingng") } instance.theClosure = {(theVerySameSsortingng: Ssortingng) -> () in println(theVerySameSsortingng) someThingReturningBool() } instance.theClosure!(someSsortingng: "I'm a cool ssortingng!")