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