2015-11-03 65 views
5

我有下面的代碼試圖字典轉換爲NSData的:斯威夫特:參數類型「[字符串:值類型]」不符合預期的類型「AnyObject」

func dataFromDict<ValueType>(dict: [String:ValueType]) -> NSData { 
    return NSKeyedArchiver.archivedDataWithRootObject(dict) 
} 

編譯器給了我這個錯誤傳遞dict作爲參數:

Argument type '[String:ValueType]' does not conform to expected type 'AnyObject'

編輯

@v adian的解決方案爲我工作。

我也試着投詞典到NSDictionary

return NSKeyedArchiver.archivedDataWithRootObject(dict as NSDictionary) 

但收到此錯誤:

Cannot convert value of type '[String:ValueType]' to type 'NSDictionary' in coercion

爲什麼?

+0

不要扔掉類型信息。希望您可以將輸入字典值限制爲實際類型,以便以後知道如何解碼它們。是的,你可以使用強制轉換消除/忽略編譯器警告,但它仍然不能解決實際問題。 –

回答

4

由於archivedDataWithRootObject預計AnyObject只投字典

func dataFromDict<ValueType>(dict: [String:ValueType]) -> NSData { 
    return NSKeyedArchiver.archivedDataWithRootObject(dict as! AnyObject) 
} 
+0

謝謝,這對我很有用。不過,我仍然困惑爲什麼字典不能轉換爲NSDictionary。 – ubertao

+0

原因是與'NSDictionary'無關的泛型類型。如果您將參數聲明爲'[String:AnyObject]'而不使用泛型類型,則不需要投入'dict''' – vadian

1

您可以使用NSJSONSerialization將字典轉換爲NSData。試試這個

let params = ["key1":"1","key2":"0"] as Dictionary<String, AnyObject> 

let data = try? NSJSONSerialization.dataWithJSONObject(params, options:NSJSONWritingOptions.PrettyPrinted) as NSData 
+0

我不能使用'AnyObject',因爲我的代碼的其他部分實例化類型爲'Int'的類(包含上述func)。 – ubertao

+0

在這種情況下,你可以用Int替換AnyObject –

相關問題