web-dev-qa-db-ja.com

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)
}

私が得るエラーは

callback?(field.text!)

エラーは、「 'String'の値型を予期される引数型 '()'に変換できません。構文の問題だとわかっています-どうあるべきかわかりません。

19
Floyd Resler

Robの答えは正しいですが、簡単な作業コールバック/完了ハンドラーの例を共有したいと思いますが、以下のサンプルプロジェクトをダウンロードして、getBoolValueの入力を試すことができます。

サンプルプロジェクトのダウンロード

スイフト2:

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
58
Dan Beaulieu

私はこの方法を使用します:

ViewController1

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

ViewController2

var callback: ((_ id: Int) -> Void)?
callback?(example_id)
6
Álvaro Agüero

callbackを引数なしとして宣言し、引数を渡そうとしています。

(()->(String))?を指定しました。これは、引数を取らず、Stringを返すオプションの関数です。

おそらく、あなたはStringを取り、何も返さないオプションの関数である((String)->())?を指定するつもりです。

6
rob mayoff

Swift 3用に更新されたコードの下で試してください

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

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

showStandardPromptのパラメーターでは、callback型を()->(String)型として宣言します。これは、パラメーターを受け取らず、Stringを返す関数です。

次に、field.text!をパラメーターとして呼び出して、以前に指定されたタイプと明らかに競合します。

callbackに指定された型を修正して、String引数を取り、何も返さないようにする必要があります。

(String)->()
2
stonesam92