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

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

Мой вопрос: как мне добавить функцию в качестве параметра к пользовательской функции?Мои усилия ниже.Это неполно, но любое руководство будет высоко ценится.Я хотел бы иметь функцию 'executeNetworkTasl' в качестве параметра для '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
}

1 Ответ

0 голосов
/ 10 сентября 2018

Вы не передали бы функцию как таковую, скорее передали бы закрытие в качестве аргумента. Функции в 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 по умолчанию отклоняется

...