Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift3-如何按名称调用类或结构函数_Swift3 - Fatal编程技术网

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

Swift3-如何按名称调用类或结构函数,swift3,Swift3,由于我来自JS背景,因此我将按存储在变量中的名称调用函数: var obj = { foobar: function(param) { // do something } }; var key = "foobar"; obj[key](123); 现在我想在Swift中重新创建它,例如: struct obj = { func foobar(param) { // do something } } let key:Strin

由于我来自JS背景,因此我将按存储在变量中的名称调用函数:

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

var key = "foobar";

obj[key](123);
现在我想在Swift中重新创建它,例如:

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

let key:String = "foobar"

obj[key](123)
不幸的是,上面的代码给出了
Type'obj.Type'没有下标成员

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

编辑-更多上下文:

我有一个用户提供的数组,其中包括:

let arr = ["apples", "oranges", "pears"]
但是这个数组可以长达20个项目。根据数组中的每个项,我需要执行某些操作。因此,我迭代数组:

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

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

    // and so on...
}
当然,我可以用一个简单的
开关
实现一个包含20个案例的功能,但这远远不够理想。如果我的数组增长到100个项目怎么办

我希望实现类似的目标:

for (key, _) in arr {
    myClass[key]()
}

我想这可能就是你想要的:

var obj: [String: Int] = {
  // do something, like call foobar(param) that's defined outside of the variable
  // or just manipulate data directly in here

  return ["foobar": 123]
  // or whatever dictionary you want that matches the type you defined for obj
}()

如果你不发布你想要的输出或行为,很难给你一个更好的答案。

我想这可能就是你想要的:

var obj: [String: Int] = {
  // do something, like call foobar(param) that's defined outside of the variable
  // or just manipulate data directly in here

  return ["foobar": 123]
  // or whatever dictionary you want that matches the type you defined for obj
}()
如果你不发布你想要的输出或行为,很难给你一个更好的答案

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

是的,您可以将函数存储到字典中 让我们定义一个函数类型

typealias FuncType = () -> ()
和2个功能

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

func func1() {
    print("Oranges")
}
现在我们可以创建一个字典,其中键是
String
,值是
FuncType

let dict : [String:FuncType] = [
    "Apples" : func0,
    "Oranges" : func1
]
当然,我们可以调用存储在字典中的函数

dict["Apples"]?() // prints "Apples"
有没有办法在结构、类或字典中按名称调用函数(如果可以在Dicts中存储函数的话?)

是的,您可以将函数存储到字典中 让我们定义一个函数类型

typealias FuncType = () -> ()
和2个功能

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

func func1() {
    print("Oranges")
}
现在我们可以创建一个字典,其中键是
String
,值是
FuncType

let dict : [String:FuncType] = [
    "Apples" : func0,
    "Oranges" : func1
]
当然,我们可以调用存储在字典中的函数

dict["Apples"]?() // prints "Apples"

这是不可能的,因为所有变量/函数名都是在编译时计算的。您试图解决的问题是什么?几乎可以肯定,解决这个问题比使用字符串调用方法要好。@Hamish我已经编辑了我的问题。这是不可能的,因为所有变量/函数名都是在编译时计算的。您试图解决的问题是什么?几乎可以肯定,解决这个问题的方法比使用字符串调用方法要好。@Hamish我编辑了我的问题