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