Swift中的回调函数语法

时间:2015-10-22 20:54:06

标签: ios swift function callback

我正在尝试将一个函数传递给另一个函数,然后执行传递的函数传递给它一个变量。

这是我的代码:

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'的值类型转换为预期的参数类型'()'。我知道这是语法问题 - 只是不知道它应该是什么。

5 个答案:

答案 0 :(得分:52)

Rob的回答是正确的,虽然我想分享一个简单的回调/完成处理程序示例,但您可以下载下面的示例项目并试用getBoolValue&# 39; s输入。

download example project

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

答案 1 :(得分:6)

你声明callback没有参数,然后你试图传递一个参数。

您指定了类型(()->(String))?,这是一个不带参数的可选函数,并返回String

也许您的意思是指定((String)->())?,这是一个可选函数,它接受String并且不返回任何内容。

答案 2 :(得分:4)

尝试下面为Swift 3更新的代码

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

getBoolValue(number : 8, completion:{ result in
    print(result)
})

答案 3 :(得分:4)

我使用这种方式:

ViewController1

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

ViewController2

var callback: ((_ id: Int) -> Void)?
callback?(example_id)

答案 4 :(得分:2)

showStandardPrompt的参数中,您声明callback的类型为()->(String),这是一个不带参数且返回String的函数。

然后用field.text!作为参数调用它,这显然与先前给定的类型冲突。

您需要更正callback的类型以获取String参数并且不返回任何内容:

(String)->()