如何链接函数并选择在Swift中执行哪些函数?

时间:2016-07-09 14:44:40

标签: ios swift closures

我希望能够链接如下所示的功能并在它们之间进行选择。在这个人为的例子中,我硬编码了#34; function_b",但在理想世界中,我希望它是随机的,甚至是由服务器控制的。我知道我可以用不同的方式创建相同的效果,但我喜欢这段代码的读取方式,所以我想这样做。

ExecutionManager("function_b").add("function_a") {
    //some code
}.add("function_b") {
    //more code
}.add("function_c") {
    //other code
}

1 个答案:

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