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