web-dev-qa-db-fra.com

Syntaxe de la fonction de rappel dans Swift

J'essaie de passer une fonction à une autre fonction, puis d'exécuter la fonction passée en lui passant une variable.

Voici mon code:

func showStandardPrompt(Prompt:String,view: UIViewController,numberInput: Bool, callback: (()->(String))?) {
    let alert = UIAlertController(title: "Input Data", message: Prompt, preferredStyle: .Alert)
    alert.addTextFieldWithConfigurationHandler { (textField) in
        if numberInput {
            textField.keyboardType = .NumberPad
        }
    }

    let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
        let field = alert.textFields![0] as UITextField
        callback?(field.text!)
    }

    alert.addAction(OKAction)
    let CancelAction = UIAlertAction(title: "Cancel", style: .Default, handler: nil)
    alert.addAction(CancelAction)
    view.presentViewController(alert,animated: true, completion: nil)
}

L'erreur que je reçois est

callback?(field.text!)

L'erreur est "Impossible de convertir le type de valeur de 'String' en type d'argument attendu '()'. Je sais que c'est une question de syntaxe - je ne sais pas ce que cela devrait être.

19
Floyd Resler

La réponse de Rob est correcte, bien que j'aimerais partager un exemple d'un simple gestionnaire de rappel/achèvement fonctionnel, vous pouvez télécharger un exemple de projet ci-dessous et expérimenter avec l'entrée de getBoolValue.

télécharger l'exemple de projet

Swift 2:

func getBoolValue(number : Int, completion: (result: Bool)->()) {
    if number > 5 {
        completion(result: true)
    } else {
        completion(result: false)
    }
}

getBoolValue(8) { (result) -> () in
    // do stuff with the result
    print(result)
}

Important à comprendre:

(String)->() // takes a String returns void
()->(String) // takes void returns a String
58
Dan Beaulieu

J'utilise de cette façon:

ViewController1

destination.callback = { (id) -> Void in
            print("callback")
            print(id)
        }

ViewController2

var callback: ((_ id: Int) -> Void)?
callback?(example_id)
6
Álvaro Agüero

Vous avez déclaré que callback ne prend aucun argument, puis vous essayez de lui passer un argument.

Vous avez spécifié le type (()->(String))?, qui est une fonction facultative qui ne prend aucun argument et renvoie un String.

Vous voulez peut-être préciser ((String)->())?, qui est une fonction facultative qui prend un String et ne renvoie rien.

6
rob mayoff

essayez ci-dessous le code mis à jour pour Swift 3

func getBoolValue(number : Int, completion: (Bool)->()) {
    if number > 5 {
        completion(true)
    } else {
        completion(false)
    }
}

getBoolValue(number : 8, completion:{ result in
    print(result)
})
6
Anand Verma

Dans les paramètres de showStandardPrompt, vous déclarez callback pour avoir le type ()->(String), qui est une fonction qui ne prend aucun paramètre et renvoie un String.

Vous l'appelez ensuite avec field.text! comme paramètre, ce qui est évidemment en conflit avec le type donné précédemment.

Vous devez corriger le type donné à callback pour prendre un argument String et ne rien retourner:

(String)->()
2
stonesam92