Swift 如何将分机中的词典展开为词典<;字符串,任意对象>;

Swift 如何将分机中的词典展开为词典<;字符串,任意对象>;,swift,dictionary,casting,swift-extensions,Swift,Dictionary,Casting,Swift Extensions,我正试着把这本字典的分机拆开作为字典。 但我遇到了一些问题,到处都找不到答案 我有一个获取字典的函数,其中我想从json字典中获取json字符串,当然,如果它是有效的json对象: // My Function func foo(dict: Dictionary<String, AnyObject>) { let jsonString = dict.jsonString // <-- 'String' is not a subtype of 'NSObject'

我正试着把这本字典的分机拆开作为字典。 但我遇到了一些问题,到处都找不到答案

我有一个获取字典的函数,其中我想从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
        }
    }
}
但是我有两个错误。
如何使其工作?

我从您的问题中了解到,当您的词典的键为
字符串,值为
任何对象时,您希望添加一些功能(执行其他工作)

您可以使用extension(与您在问题中所做的完全相同)

使用
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 "";
    }
}

我找到了这样的答案,经过测试,它成功了。如果有人知道这种方法的其他问题,我会很感兴趣。 我已将
self
转换为
AnyObject
,然后转换为
Dictionary
。这是可以接受的

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

您将得到一个错误
类型“Key”约束为非协议类型“String”
@Jonauz请检查更多信息,它正在与我一起工作,没有错误。显示您的代码当我尝试使用您的方法编译/构建时,我总是遇到这个错误。这与协议有关。@Jonauz为什么不将NSObject更改为String正如我已经说过两次的,它给出了一个错误
将“Key”类型限制为非协议类型“String”
。作为参考,我使用的是最新的Xcode 7.1。我不知道这对你有什么用。您可以将字符串更改为StringLiteralConvertible,但在我的情况下,它仍然不起作用,会出现其他两个错误。感谢您的反馈。我刚刚更新了我的问题,希望它更清楚?为什么不将NSObject更改为字符串
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 "";
    }
}
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
    }
}
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
    }
}