Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:参数类型';[字符串:ValueType]';不符合预期的类型';任何对象';_Swift_Generics - Fatal编程技术网

Swift:参数类型';[字符串:ValueType]';不符合预期的类型';任何对象';

Swift:参数类型';[字符串:ValueType]';不符合预期的类型';任何对象';,swift,generics,Swift,Generics,我有以下代码试图将字典转换为NSData: func dataFromDict<ValueType>(dict: [String:ValueType]) -> NSData { return NSKeyedArchiver.archivedDataWithRootObject(dict) } 但是得到这个错误: 无法在强制中将“[String:ValueType]”类型的值转换为“NSDictionary”类型 为什么?您可以使用NSJSONSerialization

我有以下代码试图将字典转换为NSData:

func dataFromDict<ValueType>(dict: [String:ValueType]) -> NSData {
    return NSKeyedArchiver.archivedDataWithRootObject(dict)
}
但是得到这个错误:

无法在强制中将“[String:ValueType]”类型的值转换为“NSDictionary”类型


为什么?

您可以使用NSJSONSerialization将字典转换为NSData。试试这个

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

let data = try? NSJSONSerialization.dataWithJSONObject(params, options:NSJSONWritingOptions.PrettyPrinted) as NSData
让params=[“key1”:“1”,“key2”:“0”]作为字典
让数据=尝试?NSJSONSerialization.dataWithJSONObject(参数,选项:NSJSONWritingOptions.Prettypted)作为NSData

因为
archivedDataWithRootObject
需要
任何对象
只需强制转换字典即可

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

谢谢,这对我很有用。不过,我仍然不明白为什么dict不能转换为NSDictionary。原因是泛型类型与
NSDictionary
无关。如果在没有泛型类型的情况下将参数声明为
[String:AnyObject]
,则根本不需要强制转换
dict
,`不要丢弃类型信息。希望您可以将输入字典值限制为实际类型,以便您知道以后如何解码它们。是的,您可以使用强制转换来消除/忽略编译器警告,它仍然不能解决实际问题。我不能使用“AnyObject”,因为我的代码的其他部分使用类似“Int”的类型实例化类(包含上述func)。在这种情况下,您可以用Int替换AnyObject
func dataFromDict<ValueType>(dict: [String:ValueType]) -> NSData {
  return NSKeyedArchiver.archivedDataWithRootObject(dict as! AnyObject)
}