我正在尝试创建字典扩展,其中字典的类型为。
在很多地方都在寻找并尝试了不同的方法,但是似乎没有一个可行。这是其中之一:
extension Dictionary where <String, AnyObject>{
var jsonString:String {
return ""
}
}
由于某种原因实际上不起作用的另一种方法:
extension Dictionary where Key:Hashable, Value:AnyObject {
var jsonString:String {
do {
let stringData = try NSJSONSerialization.dataWithJSONObject(self, options: NSJSONWritingOptions.PrettyPrinted)
if let string = String(data: stringData, encoding: NSUTF8StringEncoding){
return string
}
}catch _ {
}
return ""
}
}
收到:参数类型'Dictionary'与预期的'AnyObject'类型不一致
最佳答案
> = 3.1
从3.1开始,我们可以进行具体扩展,即:
extension Dictionary where Key == String {}
我们无法使用具体泛型来实现具体类型,即:
extension Dictionary where Key == String
但是,由于Dictionary符合序列,并且我们可以符合带有具体泛型的协议(protocol)类型,因此我们可以这样做:
extension Sequence where Iterator.Element == (key: String, value: AnyObject) {
func doStuff() {...
否则,我们可以将密钥约束为字符串遵循的协议(protocol),如下所示:
extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
var jsonString: String {
return ""
}
}
根据您更新的答案。 Json序列化需要一个对象,Swift字典是结构。您需要转换为
NSDictionary
您必须指定Key
以符合NSObject
才能正确转换为NSDictionary
。extension Dictionary where Key: NSObject, Value:AnyObject {
var jsonString:String {
do {
let stringData = try NSJSONSerialization.dataWithJSONObject(self as NSDictionary, options: NSJSONWritingOptions.PrettyPrinted)
if let string = String(data: stringData, encoding: NSUTF8StringEncoding){
return string
}
}catch _ {
}
return ""
}
}
请注意,词典必须符合此类型才能访问扩展名。
let dict = ["k" : "v"]
将变为
[String : String]
类型,因此在声明时必须明确:let dict: [NSObject : AnyObject] = ["k" : "v"]