-1

我正在尝试将扩展中的字典解包为字典。但我遇到了一些问题,无法在任何地方找到答案。

我有一个获取字典的函数,在其中我想从 JSON 字典中获取一个 json 字符串,当然,如果它是一个有效的 JSON 对象:

// My Function
func foo(dict: Dictionary<String, AnyObject>) {
    let jsonString = dict.jsonString    // <-- 'String' is not a subtype of 'NSObject'
}

// My Extension
extension Dictionary where Key: NSObject, Value: AnyObject {
    var jsonString: String? {
        if let dict = self as? Dictionary<String, AnyObject> {
            do {
                let data = try NSJSONSerialization.dataWithJSONObject(self as Dictionary, options: NSJSONWritingOptions.PrettyPrinted)
                if let string = String(data: data, encoding: NSUTF8StringEncoding) {
                    return string
                }
            } catch {
                print(error)
            }
            return nil
        }
    }
}

但问题是我有一个var dict: Dictionary<String, AnyObject>.

我也尝试过使用StringLiteralConvertible

extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
    var jsonString: String? {
        if let dict = self as? Dictionary<String, AnyObject> {    // <-- 'Dictionary<Key, Value>' is not convertible to 'Dictionary<String, AnyObject>'
            do {
                let data = try NSJSONSerialization.dataWithJSONObject(self as Dictionary, options: NSJSONWritingOptions.PrettyPrinted)    // <-- Cannot convert value of type 'Dictionary<Key, Value>' to type 'Dictionary<_, _>' in coercion
                if let string = String(data: data, encoding: NSUTF8StringEncoding) {
                    return string
                }
            } catch {
                print(error)
            }
            return nil
        }
    }
}

但后来我得到两个错误。我怎样才能让它工作?

4

2 回答 2

1

我从您的问题中了解到,当您的字典键为String并且值为AnyObject

您可以使用扩展名(就像您在问题中所做的那样)

extension Dictionary where Key: String, Value: AnyObject {

// do what ever you want, you have the self object here
}

使用self,你可以做任何事情

更新后:

您可以将 NSObject 更改为字符串。这是我机器上的截图:

在此处输入图像描述

更新 2

这对你有好处吗?

extension Dictionary {
    var jsonString: String? {

        for (key, value) in self{
            if let isKey = key as? String {
                // do whatever you want
                return "Forza Roma"
            }else {
                return nil
            }

        }
        return "";
    }
}
于 2015-10-23T12:44:37.770 回答
0

我找到了这样的答案,经过测试并且有效。如果有人知道这种方法的其他问题,将会很有趣。我已经转换selfAnyObject,然后转换为Dictionary<String, AnyObject>. 接缝似乎可以接受。

extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
    var jsonString: String? {
        if let dict = (self as? AnyObject) as? Dictionary<String, AnyObject> {
            do {
                let data = try NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions.PrettyPrinted)
                if let string = String(data: data, encoding: NSUTF8StringEncoding) {
                    return string
                }
            } catch {
                print(error)
            }
        }
        return nil
    }
}

如果你这样做,它也会起作用(self as? NSObject) as? Dictionary<String, AnyObject>

您很可能可以删除转换为Disctionary<String, AnyObject>,如下所示:

extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
    var jsonString: String? {
        do {
            let data = try NSJSONSerialization.dataWithJSONObject(self as! AnyObject, options: NSJSONWritingOptions.PrettyPrinted)
            if let string = String(data: data, encoding: NSUTF8StringEncoding) {
                return string
            }
        } catch {
            print(error)
        }
        return nil
    }
}
于 2015-10-23T15:48:51.170 回答