将作为参数传递给另一个函数的函数设为可选?

时间:2018-10-24 17:05:00

标签: ios swift parameter-passing optional uialertcontroller

我有一个UIAlertController扩展名,用于在我的应用中显示服务条款的弹出窗口。

我希望有两个版本的弹出窗口:一个版本,用户可以接受或拒绝ToS(将在首次使用该应用程序时显示),另一个版本的用户可以阅读其内容,然后< strong>关闭弹出窗口(随时显示在设置屏幕中)。

这两个弹出窗口极为相似,因此,我宁愿创建另一个使用修改后的参数调用termsOfServiceAlert()的函数,也不必重写两次相同的函数。但是,由于用户仅应在调用termsOfServiceAlternativeAlert()时才能关闭ToS,因此我需要将acceptdecline参数设为可选。我知道如何对普通变量执行此操作,但是我无法找到一种方法使其对作为参数传递的函数起作用。

这是代码段:

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 :(得分:0)

您需要将这些参数设置为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)
    }
}