一个Swift Decodable的可失败初始化器

3
我正在尝试解析以下json模式,海报可能为空。
{
  "poster": {},
  "recommends": []
}

我的可解码类如下:

public struct RecommendedList: Decodable {
    public let poster: Poster?
    public let recommends: [Recommend]
}

public struct Poster: Decodable {
    public let backgroundImage: URL
    public let topImage: URL
    public let windowImage: URL
    public let windowSkinImagePath: URL
    public let deeplink: URL

    public init(from decoder: Decoder) throws {
        // I want a failable intializer not one that throws
    }
}

我的问题是如何使海报可选? 我的想法是我需要一个可失败的初始化程序,但是decodable要求一个抛出异常的init。

1
不要与框架对抗。使用“throw”初始化器。可选属性已足够。 - vadian
将你的结构体、其属性和初始化器标记为public是多余的。 - Leo Dabus
@vadian 如果我有一个[Codable]属性怎么办? - zrslv
@zrxq 我不明白。 - vadian
@vadian 一个符合 Codable 协议的类对象也是 Codable 的,而且你可以在你的结构体/类/任何地方拥有一个 [Codable] 属性。好的,我认为我们正在讨论一个已经被回答了(有点)的问题:https://dev59.com/XlYO5IYBdhLWcg3wHd9o - zrslv
显示剩余6条评论
1个回答

2

看起来我需要在“Recommended List init(from decoder:)”中添加一个try?

public struct RecommendedList: Decodable {
    public let poster: Poster?
    public let recommends: [Recommend]

    enum CodingKeys: String, CodingKey {
        case poster
        case recommends
    }

    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        poster = try? container.decode(Poster.self, forKey: .poster)
        recommends = try container.decode([Recommend].self, forKey: .recommends)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接