我正在尝试将一个函数传递给另一个函数,然后执行传递的函数传递给它一个变量。
这是我的代码:
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'的值类型转换为预期的参数类型'()'。我知道这是语法问题 - 只是不知道它应该是什么。
答案 0 :(得分:52)
Rob的回答是正确的,虽然我想分享一个简单的回调/完成处理程序示例,但您可以下载下面的示例项目并试用getBoolValue
&# 39; s输入。
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)->()