#ios #swift
#iOS #swift
Вопрос:
Мы хотим преобразовать параметры функции в словарь и сохранить в другом словаре.
Словарь будет выглядеть следующим образом:
typealias FunctionName = String
typealias ArgumentName = String
typealias ArgumentValue = Any
var parameters: [FunctionName: [ArgumentName: ArgumentValue]] = [:]
Каждая функция имеет другой знак. Это может выглядеть следующим образом.
func functionA(arg1:String, arg2:Int) {
//Convert arg1 amp; arg2 in dictionary
//Save that dictionary in parameters Dictionary
//.....
}
func functionB(arg1:String, arg2:Int, arg3:String, arg4:[Double]) {
//Convert arg1, arg2, arg3, arg4 in dictionary
//Save that dictionary in parameters Dictionary
//.....
}
Одним из решений является статическое создание словаря следующим образом:
let args:[ArgumentName: ArgumentValue] = ["arg1": arg1, "arg2": arg2]
let args:[ArgumentName: ArgumentValue] = ["arg1": arg1, "arg2": arg2, "arg3": arg3, "arg4": arg4]
Но мы должны записывать это в каждую функцию, и мы также должны поддерживать это при изменении знака функции. Вот почему мы хотим сделать это динамичным.
Мы можем получить имя функции в виде строки, используя #function. Но как получить имя и значение аргументов функции в виде словаря ИЛИ массива пары ключей ИЛИ массива кортежа.
Комментарии:
1. Чего именно вы пытаетесь достичь, делая это?
2. @Alexander-Восстановите Monica для ведения журнала и тестирования. Короче говоря, я хочу сохранить аргументы функции для использования на более позднем этапе.
3. Если это для тестирования, вы, вероятно, неправильно тестируете. Такого рода проблемы обычно решаются с помощью «аспектно-ориентированного программирования», хотя я никогда не видел, чтобы это делалось в Swift.
4. Если ваша цель — использовать отражение, то вас ждет разочарование: отражение не является сильной стороной Swift. Однако, в зависимости от вашей реальной цели, есть способы решить эту проблему быстрыми способами и довольно элегантно.
5. @Alexander-Переустановите Monica Да, это может быть случай. Позвольте мне объяснить мою ситуацию. Я хочу протестировать функцию A. A вызывает функцию X amp; Y (X и Y являются фиктивными функциями). Я хочу проверить, какой аргумент выполняет передачу в X amp; Y. Какой может быть более эффективный подход для тестирования этого сценария?