我希望能够链接如下所示的功能并在它们之间进行选择。在这个人为的例子中,我硬编码了#34; function_b",但在理想世界中,我希望它是随机的,甚至是由服务器控制的。我知道我可以用不同的方式创建相同的效果,但我喜欢这段代码的读取方式,所以我想这样做。
ExecutionManager("function_b").add("function_a") {
//some code
}.add("function_b") {
//more code
}.add("function_c") {
//other code
}
答案 0 :(得分:3)
你剪掉的代码对我来说没什么意义。例如。这个部分应该是什么意思?
ExecutionManager("function_b")
您只是将字符串传递给ExecutionManager
的初始值设定项。这应该是什么意思?
但是,如果您希望能够添加此类型的功能列表
() -> ()
然后执行它们(所有这些或其中一些)您可以像这样定义ExecutionManager
class ExecutionManager {
typealias FunctionType = () -> ()
private var functions = [(String, FunctionType)]()
func add(funcName: String, function: FunctionType) -> ExecutionManager {
functions.append(funcName, function)
return self
}
func runAll() {
functions.forEach { $0.1() }
}
}
ExecutionManager().add("sayHello") {
print("hello")
}.add("sum 1 + 1") {
let sum = 1 + 1
print(sum)
}.add("say goodbye") {
print("goodbye")
}.runAll()
结果是
hello
2
goodbye
要运行基于某些逻辑的唯一函数,请查看此代码。这里我生成一个随机索引,只执行一个函数
<强>扩展强>
extension ExecutionManager {
func runRand() {
guard functions.isEmpty == false else { return }
let rand = Int(arc4random_uniform(UInt32(functions.count)))
functions[rand].1()
}
}
示例强>
ExecutionManager().add("sayHello") {
print("hello")
}.add("sum 1 + 1") {
let sum = 1 + 1
print(sum)
}.add("say goodbye") {
print("goodbye")
}.runRand()
<强>输出强>
2
在这个版本中,我们删除了末尾的runRand调用
@HyperZ感谢提示。
import Foundation
class ExecutionManager {
typealias FunctionType = () -> ()
private var functions = [(String, FunctionType)]()
func add(funcName: String, last:Bool=false, function: FunctionType) -> ExecutionManager {
functions.append(funcName, function)
if last {
runRand()
}
return self
}
func runRand() {
guard functions.isEmpty == false else { return }
let rand = Int(arc4random_uniform(UInt32(functions.count)))
functions[rand].1()
}
}
<强>代码强>
ExecutionManager().add("sayHello") {
print("hello")
}.add("sum 1 + 1") {
let sum = 1 + 1
print(sum)
}.add("say goodbye", last:true) {
print("goodbye")
}
<强>输出强>
hello