Składnia funkcji zwrotnej w języku Swift

Próbuję przekazać funkcję do innej funkcji, a następnie wykonać przekazaną funkcję przekazującą do niej zmienną.

Oto Mój kod:

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

Błąd, który dostaję jest w

callback?(field.text!)

Błąd brzmi: "nie można przekonwertować typu wartości' String 'na oczekiwany typ argumentu' ()'. Wiem, że to kwestia składni-tylko Nie wiem, co to powinno być.

Author: rob mayoff, 2015-10-22

5 answers

Odpowiedź Roba jest poprawna, chociaż chciałbym podzielić się przykładem prostego działającego programu obsługi wywołania zwrotnego / zakończenia, możesz pobrać przykładowy projekt poniżej i eksperymentować z wejściem getBoolValue.

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

Ważne do zrozumienia:

(String)->() // takes a String returns void
()->(String) // takes void returns a String
 87
Author: Dan Beaulieu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-11 07:51:50

Używam tego sposobu:

ViewController1

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

ViewController2

var callback: ((_ id: Int) -> Void)?
callback?(example_id)
 14
Author: Álvaro Agüero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-30 04:40:05

Wypróbuj poniższy kod zaktualizowany dla Swift 3

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

getBoolValue(number : 8, completion:{ result in
    print(result)
})
 10
Author: Anand Verma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-11 16:53:03

Zadeklarowałeś callback Brak argumentów, a potem próbujesz przekazać argument.

Podałeś typ (()->(String))?, który jest funkcją opcjonalną, która nie pobiera argumentów i zwraca String.

Być może chcesz podać ((String)->())?, która jest funkcją opcjonalną, która przyjmuje {[2] } i nie zwraca nic.

 6
Author: rob mayoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-22 21:03:13

W parametrach dla showStandardPrompt deklarujesz callback, że ma typ ()->(String), który jest funkcją, która nie pobiera parametrów i zwraca String.

Następnie wywoła się go z field.text! jako parametru, który oczywiście jest sprzeczny z wcześniej podanym typem.

Musisz skorygować Typ podany callback aby wziąć argument String i nie zwrócić nic:

(String)->()
 2
Author: stonesam92,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-22 21:06:33