一尘不染

字典扩展在哪里

swift

我正在尝试创建字典扩展,其中字典的类型为

在很多地方都在寻找并尝试了不同的方法,但是似乎没有一个可行。这是其中之一:

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 ""
    }
}

得到: 参数类型“字典”与预期类型的​​“ AnyObject”不符


阅读 234

收藏
2020-07-07

共1个答案

一尘不染

> = 3.1

从3.1开始,我们可以进行具体扩展,即:

extension Dictionary where Key == String {}

<3.1

我们无法使用具体泛型来实现具体类型,即:

extension Dictionary where Key == String

但是,由于Dictionary符合序列,并且我们可以符合带有具体泛型的协议类型,因此我们可以:

extension Sequence where Iterator.Element == (key: String, value: AnyObject) {
    func doStuff() {...

否则,我们可以将密钥约束为字符串遵循的协议,如下所示:

extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
    var jsonString: String {
        return ""
    }
}

根据您更新的答案。Json序列化需要一个对象,Swift字典是结构。您需要转换为。NSDictionary
必须指定Key要符合NSObject才能正确转换为NSDictionary

小提示:字典已经将约束类型输入KeyHashable,因此您最初的约束没有添加任何内容。

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"]

将成为type [String : String],因此您必须明确声明:

let dict: [NSObject : AnyObject] = ["k" : "v"]
2020-07-07