2015-09-28 85 views
3

我试图在编译时评估一个函数的签名。给定一个函数,我想获得Type从方法签名获取arg类型(镜像/反射/自检?)

例如:

func f(a: Int, b: Int) -> Int{ 
    return 1 
} 

let y = Mirror(reflecting: f) 
let types = y.subjectType 
print(types) 

我回去:

"(Int, Int) -> Int" 

这是我以字符串形式need--!我需要他们的类型形式。意图用法:

let unknownA: AnyObject = 1 
let unknownA: AnyObject = 2 

// The casts (here 'Int') are derived from the mirror above 
f(a: Int(unknownA), b: Int(unknownB)) 

编辑:哈哈!在看起来像整整一天的挖掘之后,我发现了this宝石。当我有它的工作时,将发布一个工作示例。

回答

1

我没有找到任何方式通过反射获得函数参数类型。

"\(y.subjectType)"给出函数类型的字符串表示形式:(Int, Int) -> Int。所以,你可以分析它,并获取参数的类型名称["Int", "Int"]的数组:

let params = "\(y.subjectType)".componentsSeparatedByString(" -> ")[0] 
let paramsTypes = params.substringWithRange(Range<String.Index>(start: params.startIndex.successor(), end: params.endIndex.predecessor())).componentsSeparatedByString(", ") 

我还没有找到方法,从类型名获得雨燕,但如果你有固定的在你的函数使用的类型号,然后就可以创建映射键入名称类型的字典:

let typeMap = ["Int": Int.self] 

所以,你可以调用你的函数:

f(typeMap[paramsTypes[0]](unknownA), b: typeMap[paramsTypes[1]](unknownB)) 
+0

多数民众赞成至于我为好。使用任意数量的参数处理函数不会很顺利,但我会继续。谢谢! – Damouse

+0

这非常有创意,但我们真的需要真实的反思,有些人认为Swift 4会来。 – clearlight