Отражение в Свифте - PullRequest
       1

Отражение в Свифте

1 голос
/ 17 апреля 2020

Я хотел бы создать функцию (Функция A), которая имеет в качестве параметра функцию (Функция B) с несколькими параметрами.

Таким образом, функция (B) может иметь 0,1 или более параметров, и внутри функции (A) я хотел бы делать разные вещи в зависимости от количества и типа параметров функций B ...

Я думал, что это возможно с помощью отражения, но возможно ли это в Swift?

Редактировать: 1 Давайте рассмотрим три случая для функции B, которую я хочу поддерживать:

func functionB() {
    print(“HelloWorld”) 
}


func functionB(a: Int) {
     print(“HelloWorld1”)
}

func functionB(a: Int, b:String) -> Int {
     print(“HelloWorld2”)
     return 2
}

Я хочу, чтобы независимо от метода сигнатуры функции B выполнялись различные задачи в функции A, в качестве параметра которой используется функция B.

func functionA(function: I don’t know how to pass the different cases of the function B as a parameter...generic types?) {
       if function.args = 0 {
            print(“First example”)
       }
      if function.firstParameter.self is Int.Type {
            print(“second Example”)
      }
      etc...

Я хочу чтобы добиться этого, чтобы обрабатывать разные методы подписи с помощью одной и той же функции.

Редактировать 2: Извините, что не указал его ранее, но у меня нет доступа к функции B. У меня есть чтобы выяснить во время выполнения, а не время сборки. Две функции находятся в отдельном пакете. Цель состояла в том, чтобы приложение должно динамически выполнять различные задачи во время выполнения, зная только сигнатуру метода, в частности, типы параметров.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Перегрузка.

func functionA(functionB: () -> Void) { functionB() }
func functionA(functionB: (Int) -> Void) { functionB(0) }
func functionA(functionB: (Int, String) -> Int) { functionB(0, "") }

functionA(functionB: functionB as () -> Void)
functionA( functionB: functionB(a:) )
functionA( functionB: functionB(a:b:) )
0 голосов
/ 17 апреля 2020

Как указано в комментарии, вы можете использовать Any:

func functionA(f: Any, a: Int?, b: String?) {
    if let f = f as? () -> Void {
        f()
    } else if let f = f as? (Int) -> Void , let a = a {
        f(a)
    } else if let f = f as? (Int, String) -> Int, let a = a, let b = b {
        let result = f(a, b)
        print(result)
    } else {
        print("f is not a valid object")
    }
}

func functionB(a: Int, b: String) -> Int {
    print(a, b)
    return 3
}

functionA(f: functionB, a: 42, b: "Hello world")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...