関数を別の関数に渡し、変数に渡して、渡された関数を実行しようとしています。
ここに私のコードがあります:
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'の値型を予期される引数型 '()'に変換できません。構文の問題だとわかっています-どうあるべきかわかりません。
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)
}
理解することが重要:
(String)->() // takes a String returns void
()->(String) // takes void returns a String
私はこの方法を使用します:
ViewController1
destination.callback = { (id) -> Void in
print("callback")
print(id)
}
ViewController2
var callback: ((_ id: Int) -> Void)?
callback?(example_id)
callback
を引数なしとして宣言し、引数を渡そうとしています。
型(()->(String))?
を指定しました。これは、引数を取らず、String
を返すオプションの関数です。
おそらく、あなたはString
を取り、何も返さないオプションの関数である((String)->())?
を指定するつもりです。
Swift 3用に更新されたコードの下で試してください
func getBoolValue(number : Int, completion: (Bool)->()) {
if number > 5 {
completion(true)
} else {
completion(false)
}
}
getBoolValue(number : 8, completion:{ result in
print(result)
})
showStandardPrompt
のパラメーターでは、callback
型を()->(String)
型として宣言します。これは、パラメーターを受け取らず、String
を返す関数です。
次に、field.text!
をパラメーターとして呼び出して、以前に指定されたタイプと明らかに競合します。
callback
に指定された型を修正して、String
引数を取り、何も返さないようにする必要があります。
(String)->()