Сделать функцию, переданную в качестве аргумента другой функции, необязательной? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть расширение до UIAlertController, которое я использую для отображения всплывающих Условий обслуживания в моем приложении.

Я хотел бы иметь две версии этого всплывающего окна: одно, где пользователь может принять или отклонить ToS (отображается при первом использовании приложения), и другое, где пользователь может прочитать их.а затем отклонить всплывающее окно (которое будет отображаться на экране настроек в любое время).

Два всплывающих окна чрезвычайно похожи, поэтому вместо перезаписи одной и той же функции дважды,Я бы лучше создал другую функцию, которая вызывает termsOfServiceAlert() с измененными аргументами.Однако, поскольку пользователь должен иметь возможность отклонять ToS только при вызове termsOfServiceAlternativeAlert(), мне нужно сделать аргументы accept и decline необязательными .Я знаю, как это сделать для обычных переменных, но не могу найти способ заставить его работать для функций, которые передаются в качестве аргументов.

Вот фрагмент кода:

extension UIAlertController {

    static func termsOfServiceAlert(
        title: String,
        message: String?,
        acceptText: String,
        accept: @escaping ()->Void,
        declineText: String,
        decline: @escaping ()->Void) -> UIAlertController {

            /* set up alert */

            let acceptTermsHandler: (UIAlertAction) -> Void = { (alertAction in
                accept()
            }

            let declineTermsHandler: (UIAlertAction) -> Void = { (alertAction in
                decline()
            }

            let accept = "Accept"
            alert.addAction(UIAlertAction(title: accept, style: .default, handler: acceptTermsHandler

            let decline = "Decline"
            alert.addAction(UIAlertAction(title: decline, style: .default, handler: declineTermsHandler

            return alert
    }

    static func termsOfServiceAlternativeAlert(message: String, dismiss: String) -> UIAlertController {
        /* ERROR - Nil is not compatible with expected argument type '() -> Void */
        return termsOfService(
            message: message, 
            acceptText: dismiss, 
            accept: nil, 
            declineText: nil, 
            decline: nil)
    }
}

1 Ответ

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

Вам нужно сделать эти аргументы как optional, а затем передать как nil.вот исправление,

extension UIAlertController {

    static func termsOfServiceAlert(
        title: String,
        message: String?,
        acceptText: String,
        accept: (()->Void)?,
        declineText: String?,
        decline: (()->Void)?) -> UIAlertController {

        /* set up alert */

       let alert = UIAlertController.init(title: title, message: message, preferredStyle: .alert)
       let acceptTermsHandler: (UIAlertAction) -> Void = { alertAction in
          accept?()
       }

       let declineTermsHandler: (UIAlertAction) -> Void = { alertAction in
           decline?()
        }

       alert.addAction(UIAlertAction(title: "Accept", style: .default, handler: acceptTermsHandler))

       alert.addAction(UIAlertAction(title: "Decline", style: .default, handler: declineTermsHandler))

       return alert
  }

    static func termsOfServiceAlternativeAlert(message: String, dismiss: String) -> UIAlertController {
        /* ERROR - Nil is not compatible with expected argument type '() -> Void */
        return termsOfServiceAlert(
            title: "", 
            message: message,
            acceptText: dismiss,
            accept: nil,
            declineText: nil,
            decline: nil)
    }
}
...