Динамический доступ к аргументам функции в Swift

#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. Какой может быть более эффективный подход для тестирования этого сценария?