在swift中从'text'调用函数

时间:2015-03-23 22:29:02

标签: swift alert generics

我正在编写一些通用代码,因此所有视图控制器都可以使用它。 我喜欢通用的一件事是警报功能。 这里的问题是我必须在回复中编写动作代码。 没有警告(只有按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)

1 个答案:

答案 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