0
votes

Comment passer la fermeture en tant que paramètre dans l'exécution (sélecteur, withObject)

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()
}


0 commentaires

3 Réponses :


1
votes

Y a-t-il une raison d'utiliser performer (_: avec:) ? Sinon, vous pouvez simplifier votre code et appeler votre méthode avec fermeture xxx


2 commentaires

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?



1
votes

Je pense que c'est parce que vous utilisez un type non objectif-c dans la déclaration de méthode:

@OBJC FUNC FOO (param: () -> () -> ()) La fermeture est pas un type objectif-c.

Vous pouvez faire quelque chose comme ceci; xxx

Ça fonctionne parce que (je suppose) que vous dites au runtime objc que le La méthode accepte tout qui est correctement traduit en type ID .


0 commentaires

9
votes

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 @convention code>. xxx pré>

Vous pouvez convertir une fermeture existante en bloc en l'affectant: P>

let closure = { ... }
let block: @convention(block) () -> Void = closure
perform(#selector(foo(param:)), with: block)


1 commentaires

Génial, je ne savais pas l'attribut de la convention!