Синтаксис функции обратного вызова в 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)->()