Unfortunately we don’t have a way to invoke a function with a runtime argument list because that would require runtime code generation in the most general case.
I would hack around it by handling the common cases of no arguments, 1 argument, 2 arguments, etc up to some fixed number of arguments that you consider “enough”. Use a switch on the type of the function. Slava > On Nov 3, 2017, at 2:21 PM, C. Keith Ray via swift-users > <swift-users@swift.org> wrote: > > In the code below, I'm trying to store a reference to a function with any > number of arguments, with any return type. And I want to be able to invoke > it. > > Help? > > See the comments with "*******" > > typealias Void = () > > func equalTypes(_ me: [Any.Type], _ other: [Any.Type]) -> Bool { > guard me.count == other.count else { return false } > > for i in 0 ..< me.count { > if me[i] != other[i] { return false } > } > return true > } > > struct Function { > var returnType: Any.Type > var argTypes: [Any.Type] > var function: Any // ******* any function ******* > > func perform(_ args: [Any]) -> Any { > // ******* call function() with args, return result ******* > return 0 > } > > func isCompatible(_ other: Function) -> Bool { > return self.returnType == other.returnType && > equalTypes(argTypes, other.argTypes) > } > } > > func vToV() { > print("vToV") > } > > func intToInt(_ i: Int) -> Int { > print("intToInt") > return 4 > } > > let f = Function(returnType: Void.self, > argTypes: [], > function: vToV) > let r = f.perform([]) > print(r) > > let f2 = Function(returnType: Int.self, > argTypes: [Int.self], > function: intToInt) > let r2 = f2.perform([12]) > print(r2) > > assert(f.isCompatible(f)) > assert(!f.isCompatible(f2)) > > > -- > C. Keith Ray > Senior Software Engineer / Trainer / Agile Coach > * http://www.thirdfoundationsw.com/keith_ray_resume_2014_long.pdf > <http://www.thirdfoundationsw.com/keith_ray_resume_2014_long.pdf> > > > > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users