Floyd Resler
Floyd Resler

Reputation: 1786

Callback function syntax in Swift

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

Answers (5)

Dan Beaulieu
Dan Beaulieu

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.

Swift 5:

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

Álvaro Agüero
Álvaro Agüero

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

Anand Verma
Anand Verma

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

stonesam92
stonesam92

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

rob mayoff
rob mayoff

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

Related Questions