Как добавить функцию в качестве параметра в пользовательскую функцию - быстро?

Я пытаюсь реорганизовать свой UIAlertViewController и передать функцию, которая будет выполняться, когда пользователь выбирает один из двух вариантов, запускающих действие.

Мой вопрос: как мне добавить функцию в качестве параметра к пользовательской функции? Мое усилие ниже. Он неполный, но мы будем очень признательны за любые рекомендации. Я хотел бы, чтобы функция 'performNetworkTasl' была параметром 'showBasicAlert'.

import Foundation
import UIKit



struct Alerts {
static func showBasicAlert(on vc: UIViewController, with title: String, message: String, function: ?????){

    let alert =  UIAlertController.init(title: title, message: message, preferredStyle: .alert)

    let okAction = UIAlertAction.init(title: "OK", style: .default) { (UIActionAlert) in

        performNetworkTasl()

        vc.dismiss(animated: true, completion: nil)
    }

    alert.addAction(okAction)
}
}


func performNetworkTasl(){
  // DO SOME NETWORK TASK
}

Почему вы хотите передать функцию в качестве параметра, если вы уже вызывали ее под okAction?

Rob 10.09.2018 09:45

Это должен быть параметр function: @escaping () -> Void. Он будет принимать закрытие / функции с той же сигнатурой () -> Void. Для его вызова: showAlert(on: vc, with: "", message: "", function: performNetworkTasl).

Modo Ltunzher 10.09.2018 09:54
0
2
262
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не передадите функцию как таковую, а скорее передадите закрытие в качестве аргумента. Функции в swift - это частные случаи закрытия. Замыкание можно считать анонимной функцией. Замыкания, мгновенные методы и статические методы - все они различаются только способностью захвата контекста, кроме очевидных синтаксических различий.

struct Alerts {
        static func showBasicAlert(on vc: UIViewController, with title: String, message: String, okAction: @escaping (() -> ())){

            let alert =  UIAlertController.init(title: title, message: message, preferredStyle: .alert)

            let okAction = UIAlertAction.init(title: "OK", style: .default) { (UIActionAlert) in

                okAction()

                //dismiss statement below is unnecessary
                vc.dismiss(animated: true, completion: nil)
            }

            alert.addAction(okAction)
        }
    }

И вы вызываете функцию как

    Alerts.showBasicAlert(on: your_viewController, with: "abcd", message: "abcd", okAction: {
        //do whatever you wanna do here
    })

Надеюсь это поможет

Кстати, вам не обязательно иметь явный vc.dismiss(animated: true, completion: nil) в качестве последнего оператора в любом действии, как только действие запускается, UIAlertController отклоняется по умолчанию

Другие вопросы по теме