Здравствуйте, я пытаюсь создать функцию kickass для отображения предупреждений и запуска ее функции. 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"]
    )
0
Kaan Karay 8 Дек 2018 в 19:29

1 ответ

Лучший ответ
  • Прежде всего, я настоятельно рекомендую реализовать этот метод как расширение UIViewController.

  • Во-вторых, я бы предпочел 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)
1
vadian 8 Дек 2018 в 17:11