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



_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to