【问题标题】:How to call Swift functions of type Any with args of type [Any]如何使用 [Any] 类型的 args 调用 Any 类型的 Swift 函数
【发布时间】:2019-01-09 23:36:18
【问题描述】:

我目前正在 Swift 中实现this blog post about vms and compilers in Python。我在这里遇到了问题:

我在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) -&gt; Int(String, (Bool, Date) -&gt; Date) -&gt; Float

总之,我想用arguments打电话给function

【问题讨论】:

    标签: python swift compilation compiler-construction virtual-machine


    【解决方案1】:

    一种方法是将您的函数包装在([Any]) -&gt; 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
    

    【讨论】:

    • 实际上是what I did。我想要一种更好的 Swifty 方式,但我想这是我唯一的选择。 > 注意:除了使用([Any]) throws -&gt; Any,我做了同样的事情
    猜你喜欢
    • 1970-01-01
    • 2020-02-24
    • 2020-07-07
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多