我正在编写一些通用代码,因此所有视图控制器都可以使用它。 我喜欢通用的一件事是警报功能。 这里的问题是我必须在回复中编写动作代码。 没有警告(只有按OK)或通用响应(取消,否),但是当(通用)函数需要运行时,我需要欺骗传递哪个函数。 如果我可以从某些文本运行一个函数,它将减少问题(我不必硬编码所有可以调用的函数)。 或者有更好的方法来实现我的通用'提醒?
此处示例:
func DoAlert(title: String, message: String, actions: String, sender: AnyObject, viewController : UIViewController) {.......
.....
if (actions as NSString).containsString("Yes") {
alert.addAction(UIAlertAction(title: "Yes", style: .Default) { action -> Void in
if (actions as NSString).containsString("Yes'DoAfunction()'") {
DoAfunction() }
})}
.....
}
//而不是硬编码,我喜欢抽象'之间的功能。 '并用它来调用函数
//我按如下方式调用函数:
DoAlert("Warning", alertText, "Yes'DoAfunction()'No", sender, self)
///////////解决方案:////////////////
根据Bluehound建议使用闭包,我最终为不同的响应添加了可选的闭包。
对于那些希望这样做的人,以下是我的解决方案:
解决方案:
func DoAlert(title: String, message: String, actions: String, sender: AnyObject, viewController : UIViewController, YesClosure: ()->() = {}, NoClosure: ()->() = {}) {.......
.....
if (actions as NSString).containsString("Yes") {
alert.addAction(UIAlertAction(title: "Yes", style: .Default) { action -> Void in
YesClosure() // This will the run the function if provided
})}
.....
}
//我按如下方式调用函数:
DoAlert("Warning", alertText, "YesNo", sender, self, YesClosure: DoYesFunction, NoClosure: DoNoFunction)
如果要执行nu功能,请退出该选项。 (以下仅具有NO功能)
DoAlert("Warning", alertText, "YesNo", sender, self, NoClosure: DoNoFunction)
答案 0 :(得分:1)
您可以将闭包作为参数传递,而不是传递函数的名称,而在调用函数时,您可以定义传入函数的内容。例如:
func foo(closure: () -> Void) {
closure()
}
foo {
println("Some text")
} // prints Some Text
现在,对于使用多个操作,您可以传递一组闭包:
func foo(closures: [() -> Void]) {
for closure in closures {
closure()
}
}
foo([{println("a")},
{println("b")},
{println("c")}]) // prints a b c