【问题标题】:Make my simple struct codable in Swift 4 doesn't work在 Swift 4 中使我的简单结构可编码不起作用
【发布时间】:2018-09-04 11:28:25
【问题描述】:

我是 Swift4 的新手。我正在尝试使用Codable 使我的struct 类型对象可编码和解码为JSON。

这是我的struct Product

// 我声明它符合可编码性

public struct Product: Codable {
  public let name: String
  public var isSold: Bool
  public let icon: UIImage // problem is here

  …

  // I have excluded 'icon' from codable properties
  enum CodingKeys: String, CodingKey {
        case name
        case isSold = “is_sold”
    }
}

编译器告诉我错误:'UIImage’ doesn’t conform to ‘Decodable’,但我已经定义了CodingKeys,它应该告诉哪些属性是可编码的,并且我已经排除了UIImage 属性。

我认为这样编译器不会抱怨UIImage 类型,但它仍然会抱怨。如何摆脱这个错误?

【问题讨论】:

  • 使图标成为可选;因为它是非可选的并且不能被解码,所以解码器不可能创建你的结构的实例

标签: ios swift codable


【解决方案1】:

由于UIImage 无法解码且没有默认值,因此Decodable 协议无法合成初始化程序。

如果您将icon 设为可选UIImage 并将nil 指定为默认值,您将能够从JSON 解码结构的其余部分。

public struct Product: Codable {
    public let name: String
    public var isSold: Bool
    public var icon: UIImage? = nil 
    enum CodingKeys: String, CodingKey {
        case name
        case isSold = "is_sold"
    }
}

您也可以将其设为非可选并分配一个占位符图像。

注意,根据 Swift 版本,您可能不需要 = nil 初始值。

【讨论】:

  • 那是正确的(并且还重新打开了这个问题——抱歉误读了这个问题!)。但是,对于可选项,分配 nil 不是必需的,它们默认将 nil 作为初始值。
  • 通常情况下是这样,但是在这种情况下,如果您没有显式分配初始值,则会收到一个错误,即 Decodable 无法合成初始化程序,因为它会尝试解码 UImage
  • 嗯。我在我的 iPad 上使用 Playground,因为这是我必须使用的,它肯定需要 = nil
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2019-10-11
  • 2015-11-29
  • 2018-05-11
  • 2019-03-13
  • 1970-01-01
  • 2018-04-08
相关资源
最近更新 更多