首页 > 解决方案 > 如何创建解码器的实例?

问题描述

我想初始化来自另一个模块的结构。它没有公共init()方法,但我可以通过解码 JSON 来创建它。

struct Foo: Codable {
    let name: String
    let details: String
}

我创建了一个静态函数来创建一个实例

extension Foo {
    static func create(name: String) throws -> Self {
        let dictionaryRep = ["name": name, "details": ""]
        let data = try JSONSerialization.data(withJSONObject: dictionaryRep, options: [])
        return try JSONDecoder().decode(Self.self, from: data)
    }
}

有没有办法创建一个新的 init 方法来创建一个新实例?

extension {
   public init(name: String) throws {
      try self.init(from: <#Decoder#>)
   }
}

标签: swift

解决方案


因为Foo是 a struct(不是 a class),所以您的初始化程序可以self像这样分配:

extension Foo {
    init(name: String) throws {
        let data = try JSONSerialization.data(withJSONObject: ["name": name, "details": ""])
        self = try JSONDecoder().decode(Self.self, from: data)
    }
}

推荐阅读