Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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 字符串字典:任何不符合协议';可解码';_Swift_Decodable - Fatal编程技术网

Swift 字符串字典:任何不符合协议';可解码';

Swift 字符串字典:任何不符合协议';可解码';,swift,decodable,Swift,Decodable,我试图实现一个可解码的方法来解析json请求,但是json请求在对象内部有一个字典 这是我的密码: struct myStruct : Decodable { let content: [String: Any] } enum CodingKeys: String, CodingKey { case content = "content" } 但我得到了一个错误: 类型“MyClass.myStruct”不符合协议“Decoda

我试图实现一个可解码的方法来解析json请求,但是json请求在对象内部有一个字典

这是我的密码:

    struct myStruct : Decodable {
        let content: [String: Any]
}

        enum CodingKeys: String, CodingKey {
            case content = "content"
}
但我得到了一个错误:

类型“MyClass.myStruct”不符合协议“Decodable”

如果没有此错误,如何将变量声明为字典


非常感谢您的帮助

您目前无法使用Swift编码框架解码
[String:Any]
。如果需要解码
[String:Any]
,则需要使用较低级别的反序列化策略并“手动”解码。例如,如果您的输入是JSON,则可以使用Foundation的
JSONSerialization
或类似的第三方库

关于这一问题的讨论一直围绕着快速发展展开。苹果公司的主要编码/可编码程序员Itai Ferber参与了讨论,并对提供解决方案感兴趣,但(可能会在2018年WWDC上公布,并在2018年9月/10月左右最终确定)


您可以将的实现(它是开源的)复制到您的项目中,并对其进行修改,以添加获取未评估的
[String:Any]
的功能。Itai讨论了我在上面链接的线程中所需的修改。

嗯。。。从技术上讲,您可以这样做,但这将要求您使用第三方组件作为字典表示

另外,我假设您这样做是因为
内容
可能有非规范化数据,并且您有意将其视为字典

在这种情况下,请继续执行以下操作:

import SwiftyJSON

struct MyStruct : Decodable {
    //... your other Decodable objects like
    var name: String

    //the [String:Any] object
    var content: JSON
}
这里,
JSON
是代表字典的快速JSON对象。事实上,它也代表了一个数组


工作示例:
字典是不可解码的。可能会发布JSON。
Any
不符合
Decodable
,因此
Dictionary
也不符合。如果您实际上需要存储具有完全动态键/值的字典,因此不能使用具体类型而不是
Any
,那么您需要坚持使用
JSONSerialization
。如果您确实知道所有键及其值的预期类型,则将这些值存储为具有具体类型的类的属性。@user2924482请看我的。两者最佳:
可解码的
+
[字符串:任意]
let jsonData = """
{
  "name": "Swifty",
  "content": {
    "id": 1,
    "color": "blue",
    "status": true,
    "details": {
        "array" : [1,2,3],
        "color" : "red"
    }
  }
}
""".data(using: .utf8)!

do {
    let test = try JSONDecoder().decode(MyStruct.self,
                                        from: jsonData)
    print(test)
}
catch {
    print(error)
}