Быстрое закрытие с аргументами в качестве аргумента - PullRequest
0 голосов
/ 08 октября 2018

Так что идея состоит в том, чтобы сделать создателя оповещений общего назначения, чтобы я мог передать обработчик завершения ....

 static func makeTextFieldAlert(msg:String, title:String, onOk: @escaping (_ newText:String) -> Void ) -> UIAlertController {
        let alertController = UIAlertController(title: "Add New Name", message: "", preferredStyle: UIAlertController.Style.alert)

        let saveAction = UIAlertAction(title: "Save", style: UIAlertAction.Style.default, handler: { alert -> Void in
            let firstTextField = alertController.textFields![0] as UITextField
            onOk(firstTextField.text!)
        })

Однако ..... xcode заставляет меня поместить туда _ иэто заставляет меня поместить туда @escaping ....

И .... когда я пытаюсь вызвать весь этот беспорядок ... Он даже не скомпилируется:

@IBAction func click(_ sender: Any) {
        print("here")
        let newThing:UIAlertController = Util.makeTextFieldAlert(msg: "Yes", title: "Create Thing", onOk:{_ in
            ThingUtil.createThing(thing: newText)
        } )

Поэтому я пробую $ 0 вместо newText и получаю

«Невозможно использовать анонимные аргументы замыкания внутри замыкания с явными аргументами»

И я пытаюсьчто у меня есть выше, и я получаю:

Использование неразрешенного идентификатора 'newText'

Я бы предпочел просто использовать переменную newText для ясности ....но на данный момент, я просто хочу его скомпилировать.Что я делаю неправильно?Спасибо!

1 Ответ

0 голосов
/ 08 октября 2018

Эта "вещь" компилируется на моем конце:

class Util {
    static func makeTextFieldAlert(msg:String, title:String, onOk: @escaping (_ newText:String) -> Void ) -> UIAlertController {
        let alertController = UIAlertController(title: "Add New Name", message: "", preferredStyle: UIAlertController.Style.alert)

        let saveAction = UIAlertAction(title: "Save", style: UIAlertAction.Style.default, handler: { alert -> Void in
            let firstTextField = alertController.textFields![0] as UITextField
            onOk(firstTextField.text!)
        })
        alertController.addAction(saveAction)
        return alertController
    }
}


class ViewController: UIViewController {


    @IBAction func click(_ sender: Any) {
        print("here")
        let newThing:UIAlertController = Util.makeTextFieldAlert(msg: "Yes", title: "Create Thing", onOk:{ newText in
            print(newText)
        } )
        present(newThing, animated: true, completion: nil)
    }

}

Может быть, проблема в этом ThingUtil.createThing(thing: newText).Вы уверены, что он принимает строковый аргумент?

Это должен быть ваш класс API ThingUtil

class ThingUtil {
    static func createThing(thing:String) {

    }
}
...