我从YAML文件生成快速模型时遇到问题。
swagger-codegen generate -i swagger_1.yaml -l swift4
下面的是示例模型之一。由于没有编码键
,因此无法快速构建。import Foundation
open class User: Codable {
public enum Sex: String, Codable {
case male = "male"
case female = "female"
}
public var id: Int64?
public var username: String?
public var firstName: String?
public var lastName: String?
public var sex: Sex?
public init(id: Int64?, username: String?, firstName: String?, lastName: String?, sex: Sex?) {
self.id = id
self.username = username
self.firstName = firstName
self.lastName = lastName
self.sex = sex
}
// Encodable protocol methods
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: String.self)
try container.encodeIfPresent(id, forKey: "id")
try container.encodeIfPresent(username, forKey: "username")
try container.encodeIfPresent(firstName, forKey: "firstName")
try container.encodeIfPresent(lastName, forKey: "lastName")
try container.encodeIfPresent(sex, forKey: "sex")
}
// Decodable protocol methods
public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: String.self)
id = try container.decodeIfPresent(Int64.self, forKey: "id")
username = try container.decodeIfPresent(String.self, forKey: "username")
firstName = try container.decodeIfPresent(String.self, forKey: "firstName")
lastName = try container.decodeIfPresent(String.self, forKey: "lastName")
sex = try container.decodeIfPresent(Sex.self, forKey: "sex")
}
}
也在GitHub上发布了这个问题。
答案 0 :(得分:1)
您需要添加enum CodingKeys
并重写initFromDecoder / encode。
同样,在您的情况下,根本不需要单独的编码/解码/编码键,因为类的所有属性均已可编码。
open class User: Codable {
....
enum CodingKeys: String, CodingKey {
case id, username, firstName, lastName, sex
}
// Encodable protocol methods
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encodeIfPresent(id, forKey: .id)
try container.encodeIfPresent(username, forKey: .username)
try container.encodeIfPresent(firstName, forKey: .firstName)
try container.encodeIfPresent(lastName, forKey: .lastName)
try container.encodeIfPresent(sex, forKey: .sex)
}
// Decodable protocol methods
public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decodeIfPresent(Int64.self, forKey: .id)
username = try container.decodeIfPresent(String.self, forKey: .username)
firstName = try container.decodeIfPresent(String.self, forKey: .firstName)
lastName = try container.decodeIfPresent(String.self, forKey: .lastName)
sex = try container.decodeIfPresent(Sex.self, forKey: .sex)
}
}