在 swift 中从 'text' 调用函数

Calling a function from 'text' in swift

我正在编写一些通用代码,因此所有视图控制器都可以使用它。 我喜欢做通用的事情之一是警报功能。 这里的问题是我必须对回复中的操作进行编码。 这对警告(仅按 OK)或通用响应(取消、否)没问题,但是当(通用)函数需要 运行 时,我需要欺骗以传递哪个函数。 如果我可以 运行 来自某些文本的函数,它将减少问题(并且我不必硬编码所有可以调用的函数)。 还是有更好的方法来实现我的 'generic' 警报?

此处示例:

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)

您可以传递一个闭包作为参数,而不是传递要完成的函数的名称,并在调用函数时定义传入的函数。例如:

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