Swift中的callback函数语法
我试图传递一个函数到另一个函数,然后让传递的函数传递给它一个variables。
这是我的代码:
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'的值types转换为期望的参数types'()'。我知道这是一个语法问题 – 只是不知道应该是什么。
罗布的答案是正确的,但我想分享一个简单的工作callback/完成处理程序的示例,您可以下载一个示例项目,并试验getBoolValue
的input。
下载示例项目
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
你已经声明callback
没有任何参数,然后你试图传递一个参数。
你指定了types(()->(String))?
,这是一个可选的函数,不带任何参数并返回一个String
。
也许你的意思是指定((String)->())?
,这是一个可选的函数,它接受一个String
并且不返回任何东西
在showStandardPrompt
的参数中,您声明callback
具有type ()->(String)
,这是一个不带参数并返回String
的函数。
然后你用field.text!
调用它field.text!
作为一个参数,这显然与以前给定的types相冲突。
您需要更正给callback
的types以接受一个String
参数并且不返回任何内容:
(String)->()
尝试下面的代码更新为斯威夫特3
func getBoolValue(number : Int, completion: (Bool)->()) { if number > 5 { completion(true) } else { completion(false) } } getBoolValue(number : 8, completion:{ result in print(result) })