2016-10-03 95 views
-1

我有下面的結構,變量和函數:在調用泛型函數迅速

struct MyModel { 
    var keyString: String 
    var keyNum: Int 
} 

let data = "{\"keyString\": \"valueString\", \"keyNum\": 1 }" 

func myFunction<T: AnyObject>(str: String) throws -> T? { 
    return nil 
} 

我怎麼能說與爲MyModel的功能?下面的代碼使編譯器抱怨:「通用參數‘T’不能推斷」

let myModel = try? myFunction(str: data) as? MyModel 

鏈接到斯威夫特REPL:http://swiftlang.ng.bluemix.net/#/repl/57f1fa479ce3c95fc38e63b3

+0

順便說一句,調用'mapStringToModel (str:str)'原因:「不能明確地專門化一個通用函數」 – nacho4d

+0

爲什麼我得到了贊成票? – nacho4d

+0

請不要在你的問題中包含答案。如果答案解決了您的問題,請將答案標記爲已接受;如果您自己解決了問題,也可以發佈自己的答案。謝謝。 – Moritz

回答

0

由於您的泛型類型參數與約束聲明,就像這樣:

func myFunction<T: AnyObject> 

所以無論你使用什麼類型,它必須是一個引用類型或實現NSObjectProtocol或類似的東西。

swift結構是一個值類型,所以MyModel不能用作泛型類型參數。

解決方案:

  • 更改泛型類型約束<T: Any>,使其接受的值類型。

  • 刪除泛型類型約束。

  • 將結構更改爲類並添加初始化程序。
+0

我嘗試過'',但是當我打電話給'try?時仍然出現同樣的錯誤? mapStringToModel(str:str)as? MyModel' – nacho4d

+0

@ nacho4d哎呀我忘記了。由'try?返回的類型? mapStringToModel(str:str)'是'MyModel ??'。您需要兩次打開可選件。 – Sweeper

+0

好的...我明白了。我希望有一個更簡單的方法來完成這件事。 這是我的最終代碼: http://swiftlang.ng.bluemix.net/#/repl/57f20291b1e4a3065dde0213 – nacho4d