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!