2015-09-28 86 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