0

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
}
4

1 回答 1

3

您不会像这样传递函数,而是将闭包作为参数传递。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默认情况下将被解雇

于 2018-09-10T07:46:41.613 回答