2015-11-03 61 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 –

相关问题