Reputation: 1786
I am attempting pass a function to another function and then have the passed function executed passing to it a variable.
Here is my 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)
}
The error I get is in
callback?(field.text!)
The error is "Cannot convert value type of 'String' to expected argument type '()'. I know it's a matter of syntax - just don't know what it should be.
Upvotes: 52
Views: 125495
Reputation: 19954
Rob's answer is correct, though I'd like to share an example of a simple working callback / completion handler, you can download an example project below and experiment with the getBoolValue
's input.
func getBoolValue(number : Int, completion: (Bool)->()) {
if number > 5 {
completion(true)
} else {
completion(false)
}
}
getBoolValue(number: 2) { (result) -> () in
// do stuff with the result
print(result)
}
Important to understand:
(String)->() // takes a String returns void
()->(String) // takes void returns a String
Upvotes: 133
Reputation: 4800
I use this way :
ViewController1
destination.callback = { (id) -> Void in
print("callback")
print(id)
}
ViewController2
var callback: ((_ id: Int) -> Void)?
callback?(example_id)
Upvotes: 25
Reputation: 592
try below code updated for Swift 3
func getBoolValue(number : Int, completion: (Bool)->()) {
if number > 5 {
completion(true)
} else {
completion(false)
}
}
getBoolValue(number : 8, completion:{ result in
print(result)
})
Upvotes: 17
Reputation: 4457
In the parameters for showStandardPrompt
, you declare callback
to have the type ()->(String)
, which is a function which takes no parameters and returns a String
.
You then call it with field.text!
as a parameter, which obviously conflicts with the previously given type.
You need to correct the type given to callback
to take a String
argument and return nothing:
(String)->()
Upvotes: 2
Reputation: 385650
You've declared callback
to take no arguments, and then you're trying to pass it an argument.
You specified type (()->(String))?
, which is an optional function that takes no arguments and returns a String
.
Perhaps you mean to specify ((String)->())?
, which is an optional function that takes a String
and returns nothing.
Upvotes: 7