Swift 类型';DBTweet';不符合协议';可解码';

Swift 类型';DBTweet';不符合协议';可解码';,swift,decodable,Swift,Decodable,我希望我的struct符合decodable,但我总是得到这个错误,尽管我符合它 类型“DBTweet”不符合协议“Decodable” 这是我的密码: struct DBTweet { private(set) public var user: DBUser private(set) public var profileImage: UIImage? private(set) public var tweetID: Int private(set) public

我希望我的struct符合decodable,但我总是得到这个错误,尽管我符合它

类型“DBTweet”不符合协议“Decodable”

这是我的密码:

struct DBTweet {
    private(set) public var user: DBUser
    private(set) public var profileImage: UIImage?
    private(set) public var tweetID: Int
    private(set) public var content: String
    private(set) public var postedImageURL: String?
    private(set) public var timestamp: String
    private(set) public var comments: [DBComment]
}

extension DBTweet: Decodable {
    enum MyStructKeys: String, CodingKey { // declaring our keys
        case user, tweetID, content, postedImageURL, timestamp, comments
    }

    init(from decoder: Decoder) throws {

    }
}

您还没有实现init(from:Decoder)。 如果所有模型属性都符合可编码到的,则也可以使模型符合可编码(可解码)的要求,而无需实现它们

struct DBTweet: Codable {
    private(set) public var user: DBUser
    private(set) public var profileImage: UIImage?
    private(set) public var tweetID: Int
    private(set) public var content: String
    private(set) public var postedImageURL: String?
    private(set) public var timestamp: String
    private(set) public var comments: [DBComment]
}
确保DBUser和DBComment也符合Codable

[更新] 使用init:

struct DBTweet: Decodable {
    private(set) public var user: DBUser
    private(set) public var profileImage: UIImage?
    private(set) public var tweetID: Int
    private(set) public var content: String
    private(set) public var postedImageURL: String?
    private(set) public var timestamp: String
    private(set) public var comments: [DBComment]

    enum CodingKeys: String, CodingKey {
        case user, tweetID, content, postedImageURL, timestamp, comments
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.user = try container.decode(DBUser.self, forKey: .user)
        self.profileImage = nil // Construct here your profileImage
        self.tweetID = try container.decode(Int.self, forKey: .tweetID)
        self.content = try container.decode(String.self, forKey: .content)
        self.postedImageURL = try container.decodeIfPresent(String.self, forKey: .postedImageURL)
        self.timestamp = try container.decode(String.self, forKey: .timestamp)
        self.comments = try container.decode([DBComment].self, forKey: .comments)
    }
}

是的,没有init和profileImage属性,但我添加了我不想解码的profileImage,因为我想在代码中手动添加它,所以我必须添加init解码器还是不添加?更新了答案,如果有帮助,请向上投票。我得到这个错误:“Decoder”类型的值没有成员“container”,不幸的是仍然是相同的错误。这很奇怪。它发生在init块的第一行哦,我知道为什么。我有另一个结构称为解码器