Swift 列表不符合可编码

Swift 列表不符合可编码,swift,realm,swift4,codable,Swift,Realm,Swift4,Codable,因此,我使用的是realm,两个模型之间有以下关系:一个单元有许多测试: 有没有办法让Codable和Realm更好地发挥作用?第一条错误消息明确指出,如果实现自定义init方法decode,则还必须实现encodeto:encode以符合协议 如果您只解码对象,而不需要对其进行编码,则只采用可解码。 否则,将实现encodeto: 要解决第二个错误,请明确声明编码密钥。第一条错误消息明确指出,如果实现自定义init方法decode,则还必须实现encodeto:encode以符合协议 如果您只

因此,我使用的是realm,两个模型之间有以下关系:一个单元有许多测试:


有没有办法让Codable和Realm更好地发挥作用?

第一条错误消息明确指出,如果实现自定义init方法decode,则还必须实现encodeto:encode以符合协议

如果您只解码对象,而不需要对其进行编码,则只采用可解码。 否则,将实现encodeto:


要解决第二个错误,请明确声明编码密钥。

第一条错误消息明确指出,如果实现自定义init方法decode,则还必须实现encodeto:encode以符合协议

如果您只解码对象,而不需要对其进行编码,则只采用可解码。 否则,将实现encodeto:


要解决第二个错误,请显式声明编码键。

您的代码有几个问题。首先,如果您只想实现initfrom:方法,而不想实现encode方法,请声明与Decodable而不是Codable的一致性。其次,在创建自己的initfrom:方法时需要实现CodingKeys,并且还需要从方便的初始值设定项调用类的指定初始值设定项

在初始值设定项中也不需要else子句,因为测试已经被初始化为一个空列表,向它附加一个空数组没有任何意义

class Unit: Object, Decodable {
    @objc dynamic var id: String = ""
    let tests = List<Test>()

    private enum CodingKeys: String, CodingKey {
        case id, tests
    }

    convenience required init(from decoder: Decoder) throws {
        self.init()
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(String.self, forKey: .id)
        if let arr = try container.decodeIfPresent(Array<Test>.self, forKey: .tests) {
            tests.append(objectsIn: arr)
        }
    }
}

您的代码有几个问题。首先,如果您只想实现initfrom:方法,而不想实现encode方法,请声明与Decodable而不是Codable的一致性。其次,在创建自己的initfrom:方法时需要实现CodingKeys,并且还需要从方便的初始值设定项调用类的指定初始值设定项

在初始值设定项中也不需要else子句,因为测试已经被初始化为一个空列表,向它附加一个空数组没有任何意义

class Unit: Object, Decodable {
    @objc dynamic var id: String = ""
    let tests = List<Test>()

    private enum CodingKeys: String, CodingKey {
        case id, tests
    }

    convenience required init(from decoder: Decoder) throws {
        self.init()
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(String.self, forKey: .id)
        if let arr = try container.decodeIfPresent(Array<Test>.self, forKey: .tests) {
            tests.append(objectsIn: arr)
        }
    }
}

我已经找到了它不起作用的原因。这是Xcode的缓存。我已经删除了Xcode派生数据文件夹的内容,现在它正在正确编译和解析json


对不起,各位

我找到了它不起作用的原因。这是Xcode的缓存。我已经删除了Xcode派生数据文件夹的内容,现在它正在正确编译和解析json


对不起,各位

即使我使用Decodable而不是Codable,我也会有同样的错误!发生第二个错误是因为编码密钥测试期望解码列表,但您正在解码数组。为列表声明具有不同名称的属性或显式声明编码键。因为我无法执行此操作:tests=try container.decodeList.self,forKey:.tests。这就是为什么我首先使用数组,然后将其附加到tests的属性中。解决方案是另外声明let testArray:array为dummy,如果let arr=try container.decodeIfPresentArray.self,forKey:.testArray或(如前所述)显式声明编码键以将键与属性名分开。但realm的文档明确说明使用列表将对象链接在一起!。另外,它似乎可以与其他用户一起使用,但对我来说却不行:。即使我使用Decodable而不是Codable,我也会有同样的错误!发生第二个错误是因为编码密钥测试期望解码列表,但您正在解码数组。为列表声明具有不同名称的属性或显式声明编码键。因为我无法执行此操作:tests=try container.decodeList.self,forKey:.tests。这就是为什么我首先使用数组,然后将其附加到tests的属性中。解决方案是另外声明let testArray:array为dummy,如果let arr=try container.decodeIfPresentArray.self,forKey:.testArray或(如前所述)显式声明编码键以将键与属性名分开。但realm的文档明确说明使用列表将对象链接在一起!。另外,它似乎可以与其他用户一起使用,但对我来说却不行:。我已经用我现有的代码更新了我的第一篇文章,它已经包含了你评论中提到的所有要点。尽管如此,由于存在错误,我的项目将无法编译。@SahbiBelgacem您仍然使用可编码而不是可解码,因此出现了错误。如果您实际使用的是Decodable,那么在引用Encodable Conformance时就不会出现错误对不起,我已经更新了代码。我写的不是可解码的,而是Codable@SahbiBelgacem问题中的代码与错误仍然不一致。如果只声明符合Decodable,则无法获得关于Encodable的错误。此外,我的答案中的代码编译时没有任何错误,我在发布之前已经测试过了,所以如果你使用相同的代码,你不会得到任何编译器错误。我知道!这很奇怪。我已经清理了缓存,现在它工作了。¯_ツ_/''我已经用我的现有代码更新了我的初始帖子,其中已经包含了您评论中所述的所有要点。尽管如此
,如果出现错误,我的项目将无法编译。@SahbiBelgacem您仍然使用可编码而不是可解码,因此出现错误。如果您实际使用的是Decodable,那么在引用Encodable Conformance时就不会出现错误对不起,我已经更新了代码。我写的不是可解码的,而是Codable@SahbiBelgacem问题中的代码与错误仍然不一致。如果只声明符合Decodable,则无法获得关于Encodable的错误。此外,我的答案中的代码编译时没有任何错误,我在发布之前已经测试过了,所以如果你使用相同的代码,你不会得到任何编译器错误。我知道!这很奇怪。我已经清理了缓存,现在它工作了。¯_ツ_/¯
class Unit: Object, Decodable {
    @objc dynamic var id: String = ""
    let tests = List<Test>()

    private enum CodingKeys: String, CodingKey {
        case id, tests
    }

    convenience required init(from decoder: Decoder) throws {
        self.init()
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(String.self, forKey: .id)
        if let arr = try container.decodeIfPresent(Array<Test>.self, forKey: .tests) {
            tests.append(objectsIn: arr)
        }
    }
}