[swift-users] How to store ref to any kind of function, and call with it argument list?
C. Keith Ray
keithray at mac.com
Fri Nov 3 16:21:09 CDT 2017
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20171103/db65b69e/attachment.html>
More information about the swift-users
mailing list