Синтаксис функции обратного вызова в Swift
Я пытаюсь передать функцию другой функции, а затем передать переданную функцию, передав ей переменную.
Вот мой код:
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)
}
Ошибка, которую я получаю,
callback?(field.text!)
Ошибка: "Невозможно преобразовать тип значения" String "в ожидаемый тип аргумента"() ". Я знаю, что это вопрос синтаксиса - просто не знаю, каким он должен быть.
Ответы
Ответ 1
Ответ роба верный, хотя я хотел бы поделиться примером простого рабочего обработчика обратного вызова/завершения, вы можете скачать пример проекта ниже и поэкспериментировать с входом getBoolValue
.
скачать пример проекта
Swift 2:
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)
}
Важно понимать:
(String)->() // takes a String returns void
()->(String) // takes void returns a String
Ответ 2
Вы объявили callback
чтобы не принимать никаких аргументов, и затем вы пытаетесь передать ему аргумент.
Вы указали тип (()->(String))?
, которая является необязательной функцией, которая не принимает аргументов и возвращает String
.
Возможно, вы хотите указать ((String)->())?
, которая является необязательной функцией, которая принимает String
и ничего не возвращает.
Ответ 3
попробуйте обновить код для Swift 3
func getBoolValue(number : Int, completion: (Bool)->()) {
if number > 5 {
completion(true)
} else {
completion(false)
}
}
getBoolValue(number : 8, completion:{ result in
print(result)
})
Ответ 4
Я использую этот способ:
ViewController1
destination.callback = { (id) -> Void in
print("callback")
print(id)
}
ViewController2
var callback: ((_ id: Int) -> Void)?
callback?(example_id)
Ответ 5
В параметрах showStandardPrompt
вы объявляете callback
чтобы иметь тип ()->(String)
, который является функцией, которая не принимает параметров и возвращает String
.
Затем вы вызываете его с помощью field.text!
как параметр, который явно противоречит ранее заданному типу.
Вам нужно скорректировать тип, заданный для callback
для принятия аргумента String
и возврата ничего:
(String)->()