Очевидно, что ошибка, с которой вы сталкиваетесь:
Невозможно преобразовать значение типа 'UIAlertAction' в ожидаемый тип аргумента '((UIAlertAction) -> Void)?'
это потому, что okFunction
параметр типа UIAlertAction
, это неверная часть.Вы должны позволить okFunction
иметь тип ((UIAlertAction) -> Void)?
вместо:
func showOKCancelAlertController(title: String, message: String, okFunction: ((UIAlertAction) -> Void)?) {
let myAlertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
myAlertController.addAction(UIAlertAction(title: "OK", style: .default, handler: okFunction))
myAlertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
present(myAlertController, animated: true)
}
, и это потому, что подпись UIAlertAction
init:
init(title: String?, style: UIAlertAction.Style, handler: ((UIAlertAction) -> Void)? = nil)
,
параметр handler
ожидает ((UIAlertAction) -> Void)?
.
Таким образом, вы называете его следующим образом:
showOKCancelAlertController(title: "title", message: "message") { _ in
print("here is what to do when tapping the OK button")
}
Кроме того, если для кнопки ОК нет действия, чтоВы могли бы дать значение nil
по умолчанию для параметра okFunction
:
func showOKCancelAlertController(title: String, message: String, okFunction: ((UIAlertAction) -> Void)? = nil)
и назвать его как:
showOKCancelAlertController(title: "title", message: "message")
На самом деле, это приводит к довольно крутой вещи:Ваш случай: на данном этапе вам даже не нужно реализовывать два разных метода, вы можете просто реализовать один метод и передать для него параметр okFunction
, только если он необходим!Пример:
func showAlertController(title: String, message: String, okFunction: ((UIAlertAction) -> Void)? = nil) {
let myAlertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
myAlertController.addAction(UIAlertAction(title: "OK", style: .default, handler: okFunction))
if let okFun = okFunction {
myAlertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: okFun))
}
present(myAlertController, animated: true)
}
Если вы хотите показать его одной кнопкой:
showAlertController(title: "title", message: "message")
и для двух кнопок:
showAlertController(title: "title", message: "message") { _ in
// ...
}