Decodable 结构中是否可以有未解码的值?

问题描述 投票:0回答:1

我有一个“课程”结构,用于解码某些 JSON 值:

struct Course: Decodable, Identifiable {
    var name: String?
    var courseCode: String
    var id: Int
    var image_download_url: String?
    var term: Term?

    private enum CodingKeys: String, CodingKey {
        case id
        case name
        case image_download_url
        case term
        case courseCode = "course_code"
    }
}

我发现 Course 结构也能够存储值非常有用

bgColor
。我是否需要定义一个包含
Course
以及
bgColor
中的所有数据的新结构?

swift decodable
1个回答
0
投票

您不需要创建一个新的结构来包含未解码的值,例如

bgColor
。您只需将其作为属性添加到
Course
结构体中,并将其标记为不属于
Codable
解码过程的一部分。这样,
bgColor
就可以存储不是来自 JSON 的数据。

以下是修改结构的方法:

struct Course: Decodable, Identifiable {
    var name: String?
    var courseCode: String
    var id: Int
    var image_download_url: String?
    var term: Term?

    // Non-decoded value
    var bgColor: String? // This is not part of the JSON decoding

    private enum CodingKeys: String, CodingKey {
        case id
        case name
        case image_download_url
        case term
        case courseCode = "course_code"
    }
}

// Example usage:
let jsonData = """
{
    "id": 1,
    "name": "Math 101",
    "image_download_url": "http://example.com/image.png",
    "term": null,
    "course_code": "MTH101"
}
""".data(using: .utf8)!

do {
    var course = try JSONDecoder().decode(Course.self, from: jsonData)
    course.bgColor = "blue" // You can set this manually
    print(course)
} catch {
    print("Decoding failed: \(error)")
}

这种方法使您的结构保持轻量级,并允许您手动管理属性,例如

bgColor

© www.soinside.com 2019 - 2024. All rights reserved.