Swift3 - 如何按名称调用类或结构函数

Pon*_*ono 0 swift3

由于我有 JS 背景,这就是我通过存储在变量中的名称调用函数的方式:

var obj = {
    foobar: function(param) {
        // do something
    }
};

var key = "foobar";

obj[key](123);
Run Code Online (Sandbox Code Playgroud)

现在我想在 Swift 中重新创建它,例如:

struct obj = {
    func foobar(param) {
        // do something
    }
}

let key:String = "foobar"

obj[key](123)
Run Code Online (Sandbox Code Playgroud)

不幸的是上面的代码给出了Type 'obj.Type' has no subscript members

有没有办法通过结构、类或字典中的名称调用函数(如果甚至可以在字典中存储函数?)

编辑-更多背景:

我有一系列用户提供的内容:

let arr = ["apples", "oranges", "pears"]
Run Code Online (Sandbox Code Playgroud)

但这个数组最多可以有 20 项。根据数组的每一项,我需要执行某些操作。所以我迭代数组:

for (key, _) in arr {
    if (key == "apples") {
        handleApples()
    }

    if (key == "oranges") {
        handleOranges()
    }

    // and so on...
}
Run Code Online (Sandbox Code Playgroud)

当然,我可以拥有一个switch包含 20 个案例的简单函数,但这远非理想。如果我的数组增长到 100 个项目怎么办?

我希望能够实现类似的目标:

for (key, _) in arr {
    myClass[key]()
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*tti 5

有没有办法通过结构、类或字典中的名称调用函数(如果甚至可以在字典中存储函数?)

是的,您可以将函数存储到字典中

我们定义一个函数类型

typealias FuncType = () -> ()
Run Code Online (Sandbox Code Playgroud)

和 2 个功能

func func0() {
    print("Apples")
}

func func1() {
    print("Oranges")
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以创建一个字典,其中键是String,值是FuncType

let dict : [String:FuncType] = [
    "Apples" : func0,
    "Oranges" : func1
]
Run Code Online (Sandbox Code Playgroud)

当然,我们可以调用存储在字典中的函数

dict["Apples"]?() // prints "Apples"
Run Code Online (Sandbox Code Playgroud)