我有一个UIAlertController
扩展名,用于在我的应用中显示服务条款的弹出窗口。
我希望有两个版本的弹出窗口:一个版本,用户可以接受或拒绝ToS(将在首次使用该应用程序时显示),另一个版本的用户可以阅读其内容,然后< strong>关闭弹出窗口(随时显示在设置屏幕中)。
这两个弹出窗口极为相似,因此,我宁愿创建另一个使用修改后的参数调用termsOfServiceAlert()
的函数,也不必重写两次相同的函数。但是,由于用户仅应在调用termsOfServiceAlternativeAlert()
时才能关闭ToS,因此我需要将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)
}
}
答案 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)
}
}