#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
}()
Довольно сложно дать вам лучший ответ, не публикуя тип вывода или поведение, которое вы ищете.