从方法签名中获取arg类型(镜像/反射/内省?)



我试图在编译时评估函数的签名。给定一个函数,我想得到Type

例如:

func f(a: Int, b: Int) -> Int{
    return 1
}
let y = Mirror(reflecting: f)
let types = y.subjectType
print(types)

我回来了:

"(Int, Int) -> Int"

这正是我所需要的--字符串形式!我需要打字的形式。预期用途:

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))

编辑:哈哈!经过一整天的挖掘,我发现了这块宝石。当我有工作的时候,我会发布一个工作示例。

我没有找到任何通过反射获取函数参数类型的方法。

"(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(", ")

我也没有找到从类型名称中获取Swift类型的方法,但如果你的函数中使用了固定数量的类型,那么你可以创建一个将类型名称映射到类型的字典:

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

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

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

最新更新