可解码类的失败初始化程序

时间:2019-07-01 09:41:18

标签: ios swift codable decodable

如果标题丢失,我希望初始化返回nil。

  1. ?添加到init会产生以下错误:
  

失败的初始化器('init?')无法满足初始化失败器的初始要求'init(from :)'

  1. 添加if title == nil { return nil}会产生以下错误:
  

只有失败的初始化程序才能返回“ nil”

class ClassA: Decodable {

    let title: String
    let subtitle: String?

    private enum CodingKeys: String, CodingKey {
        case title
        case subtitle
    }

   required init(from decoder: Decoder) throws {

// changing the signature to:
// required init?(from decoder: Decoder) throws
// produced: 
// Non-failable initializer requirement 'init(from:)' cannot be satisfied by a failable initializer ('init?')

        let container = try decoder.container(keyedBy: CodingKeys.self)

        guard let theTitle = try container.decode(String.self, forKey: .title) else {

            return nil // Only a failable initializer can return 'nil'


        }

        title = theTitle
        subtitle = try? container.decode(String.self, forKey: .subtitle)
   }
}

1 个答案:

答案 0 :(得分:0)

Failable initializer 暂时不适用于Codable类型。

此外,我认为这种情况甚至不需要failable initializer。如果 JSON 中没有nil,因为它不是title,则将自动获得对象的optional

而且,enum CodingKeys并没有要求,因为根据您的代码,属性名称 JSON密钥相匹配。

都不需要实施init(from:),因为您在这里没有进行任何特定的解析。

保持模型尽可能干净,

class ClassA: Decodable {
    let title: String
    let subtitle: String?
}

您可以使用

来解析 JSON响应
let classA = try? JSONDecoder().decode(ClassA.self, from: data)