我正在尝试重构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
}
答案 0 :(得分:3)
您不会像这样传递函数,而是会将闭包作为参数传递。快速功能是关闭的特殊情况。可以将闭包假定为匿名函数。闭包,即时方法和静态方法都只是在上下文捕获能力上有所不同,而没有明显的语法差异。
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
就会默认关闭