Как вызывать функции Swift типа Any с аргументами типа [Any] - PullRequest
0 голосов
/ 10 января 2019

Я сейчас нахожусь в процессе внедрения этого блога о vms и компиляторах на Python в Swift. Я столкнулся с проблемой здесь:

У меня есть функция в Any. У меня есть свои аргументы в [Any]. Я хочу вызвать эту функцию, не зная, что это за аргументы. В посте Python, поскольку Python динамический, он прост, но в Swift я предполагаю, что это невозможно. Есть ли у вас какие-либо способы его реализации?

let numberOfArgs: Int = try intify(instruction.arg)
let arguments: [Any] = (0 ..< numberOfArgs).compactMap { _ in
    return (stack.pop() as? Instruction)?.arg
}
let function: Any = try popVal(&stack)

function - это закрытие Swift. например, (Int, Int) -> Int, (String, (Bool, Date) -> Date) -> Float

В заключение хочу позвонить function с arguments

1 Ответ

0 голосов
/ 10 января 2019

Один из способов сделать это - обернуть ваши функции в замыкание типа ([Any]) -> Any. Затем в замыкании распакуйте аргументы, приведите их к нужным типам и вызовите функцию. Наконец, приведите результат как Any:

func add(a: Int, b: Int) -> Int {
    return a + b
}

func mult(a: Double, b: Double) -> Double {
    return a * b
}

var functions = [Any]()
var inputs = [[Any]]()

let f: ([Any]) -> Any = { arr in
    return add(a: arr[0] as! Int, b: arr[1] as! Int) as Any
}

functions.append(f)
inputs.append([3, 5])

let g: ([Any]) -> Any = { arr in
    return mult(a: arr[0] as! Double, b: arr[1] as! Double) as Any
}

functions.append(g)
inputs.append([6.0, 7.0])

// Each time through the loop, get one function stored as Any and
// one array of inputs with type [Any]
for (function, input) in zip(functions, inputs) {
    // Downcast function from Any to ([Any]) -> Any
    let f = function as! ([Any]) -> Any

    // Call the function
    print(f(input))
}

Выход:

8
42.0
...