Swift создает функцию, которая запускает другую функцию, которая была реализована во время вызова. (Не так сложно) - PullRequest
0 голосов
/ 08 декабря 2018

Здравствуйте, я пытаюсь создать функцию офигенного, чтобы показывать оповещения и запускать ее функцию.Buuut, к сожалению, XCode, и я запутался здесь:

buttonAction:Array<(Any) -> Any)>

Ожидается '>', чтобы завершить общий список аргументов

func callAlert(_ view: UIViewController, title:String, message:String, buttonName:Array<String>, buttonAction:Array<(Any) -> Any)>) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)

    for index in 0..<buttonName.count{
    alert.addAction(UIAlertAction(title: buttonName[index], style: .default, handler: { action in
    switch action.style{
    case .default:
        print("default")
        buttonAction()

    case .cancel:
        print("cancel")

    case .destructive:
            print("destructive")

        }}))}
    view.present(alert, animated: true, completion: nil)
}

Как мне вызвать функцию?Пожалуйста, проверьте ниже:

callAlert(self,
          title: "Donate type",
          message: "Thanks for your support!",
          buttonName: ["Buy me a coffee!","Something"]
    )

1 Ответ

0 голосов
/ 08 декабря 2018
  • Прежде всего, я настоятельно рекомендую реализовать метод как расширение из UIViewController.

  • Второе из всех I 'предпочел бы presentAlert() над callAlert()

  • Третья, а не два массива для кнопок и действий, используют один массив кортежей для title, style и action.
    Кстати, неопределенный тип (Any) -> Any очень, очень плох, потому что обработчики UIAlertAction явно ((UIAlertAction) -> Void)?

  • Наконец добавьте необязательный completion обработчик


extension UIViewController {

    func presentAlert(title: String,
                      message: String,
                      alertActions: [(title: String, style: UIAlertAction.Style, action: ((UIAlertAction) -> Void)?)],
                      completion: (() -> Void)? = nil) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        for action in alertActions {
            alert.addAction(UIAlertAction(title: action.title, style: action.style, handler: action.action))
        }
        self.present(alert, animated: true, completion: completion)
    }
}

И использовать его внутри UIViewController

let buyCoffeeAction : (UIAlertAction) -> Void = { action in
    // do something
}

let somethingAction : (UIAlertAction) -> Void = { action in
    // do something
}

presentAlert(title: "Donate type",
             message: "Thanks for your support!",
             alertActions: [(title: "Buy me a coffee!", style: .default, action: buyCoffeeAction),
                            (title: "Something", style: .destructive, action: somethingAction)],
             completion: nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...