Swift中的回调函数语法

Flo*_*ler 23 function callback ios 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)
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

callback?(field.text!)
Run Code Online (Sandbox Code Playgroud)

错误是"无法将'String'的值类型转换为期望的参数类型'()'.我知道这是语法问题 - 只是不知道应该是什么.

Dan*_*ieu 62

Rob的回答是正确的,虽然我想分享一个简单的回调/完成处理程序的例子,你可以下载一个示例项目并尝试getBoolValue输入.

下载示例项目

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)
}
Run Code Online (Sandbox Code Playgroud)

重要的是要了解:

(String)->() // takes a String returns void
()->(String) // takes void returns a String
Run Code Online (Sandbox Code Playgroud)

  • `完成(结果:数字> 5)`? (2认同)
  • *函数类型不能有参数标签;在“结果”之前使用“ _” *错误 (2认同)

Ana*_*rma 7

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

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

getBoolValue(number : 8, completion:{ result in
    print(result)
})
Run Code Online (Sandbox Code Playgroud)


rob*_*off 6

你已声明callback不接受任何参数,然后你试图传递一个参数.

你指定了type (()->(String))?,这是一个不带参数的可选函数,返回一个String.

也许你的意思是指定((String)->())?,这是一个可选的函数,它取一个String并且什么都不返回.


Álv*_*ero 6

我用这种方式:

ViewController1

destination.callback = { (id) -> Void in
            print("callback")
            print(id)
        }
Run Code Online (Sandbox Code Playgroud)

ViewController2

var callback: ((_ id: Int) -> Void)?
callback?(example_id)
Run Code Online (Sandbox Code Playgroud)