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:String = "foobar"

obj[key](123)
  

Приведенный выше код, к сожалению, дает Type 'obj.Type' has no subscript members

Есть ли какой-либо способ вызывать функции по именам в структуре, классе или словаре (если вообще возможно хранить функции в Dicts?)

РЕДАКТИРОВАТЬ — БОЛЬШЕ КОНТЕКСТА:

У меня есть предоставленный пользователем массив вещей, говорящий:

 let arr = ["apples", "oranges", "pears"]
  

но этот массив может содержать до 20 элементов. На основе каждого элемента массива мне нужно выполнить определенное действие. Итак, я перебираю массив:

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

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

    // and so on...
}
  

Конечно, у меня может быть функция с простым switch , которая состояла бы из 20 случаев, но это далеко от идеала. Что, если мой массив вырастет, скажем, до 100 элементов?

Я надеялся достичь чего-то подобного этому:

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

Комментарии:

1. Это невозможно, потому что все имена переменных / функций оцениваются во время компиляции.

2. Какую проблему вы пытаетесь решить? Почти наверняка есть лучший способ решить эту проблему, чем использовать строки для вызова методов.

3. @Hamish Я отредактировал свой вопрос

Ответ №1:

Есть ли какой-либо способ вызывать функции по именам в структуре, классе или словаре (если вообще возможно хранить функции в 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"
  

Ответ №2:

Я думаю, это может быть то, что вы ищете:

 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
}()
  

Довольно сложно дать вам лучший ответ, не публикуя тип вывода или поведение, которое вы ищете.