J'essaie d'essayer la fermeture en tant que paramètre à swift et l'exécute dans la méthode sélecteur.
override func viewDidLoad() { super.viewDidLoad() let closure = { print(self.isCityChoosen) } perform(#selector(foo(param:)), with: closure) } @objc func foo(param: () -> () ) { param() }
3 Réponses :
Y a-t-il une raison d'utiliser performer (_: avec:) code>? Sinon, vous pouvez simplifier votre code et appeler votre méthode avec fermeture
Je veux m'opposer qui répond à l'appel de sélecteur param () quand il en a besoin
@Truehekka Où avez-vous besoin exactement de cela? Vous ne pouvez pas éviter cela?
Je pense que c'est parce que vous utilisez un type non objectif-c dans la déclaration de méthode:
Vous pouvez faire quelque chose comme ceci; p> Ça fonctionne parce que (je suppose) que vous dites au runtime objc que le La méthode accepte @OBJC FUNC FOO (param: () -> () -> ()) code> La fermeture est pas un type objectif-c. p>
tout code> qui est correctement traduit en type
ID code>. p> p>
Votre fermeture n'est pas un bloc d'objectif-C, il ne peut donc pas être transmis par le temps d'exécution de l'OBJC. Vous devez le marquer comme un bloc utilisant Vous pouvez convertir une fermeture existante en bloc en l'affectant: P> @convention code>.
let closure = { ... }
let block: @convention(block) () -> Void = closure
perform(#selector(foo(param:)), with: block)
Génial, je ne savais pas l'attribut de la convention!