gpt4 book ai didi

ios - 为什么为某些属性定义 CodingKeys 需要初始化程序?

转载 作者:行者123 更新时间:2023-12-01 16:12:54 27 4
gpt4 key购买 nike

编译正常没有问题:

class User: Codable {
let name: String
let email: String
}

但是,如果我们有一个不是由 CodingKey 表示的属性,它需要一个初始化器:
class User: Codable { // Class 'User' has no initializers
let name: String
let email: String

private enum CodingKeys: String, CodingKey {
case name = "username"
}
}

为什么它认为缺少合成初始化程序是问题所在,而不是需要 CodingKey 的警告或错误?为什么这会违反 Decodable 的一致性?

编辑:由于有些人似乎很困惑,我不是在问如何解决这个错误。这是显而易见的。当您没有为所需属性指定 CodingKey 时,我在问 Codable 协议(protocol)中发生了什么。

最佳答案

具有至少一个没有默认值的属性的类需要一个初始化器来初始化该属性。

class User {
let name: String
let email: String
}

Class 'User' has no initializers



当您符合 Codable ,或者更具体地说 Decodable正如您所注意到的,该类获得了一个综合初始化器,即 User.init(from: Decoder) ,解决了上述问题。这个合成的初始化器将使用以属性命名的编码键。

class User: Decodable { ... }

一旦你在 User 中定义了一个枚举调用 CodingKeys (确切的名称很重要), Decodable 的合成一致性要求有一个 key 每个属性 .换句话说,只要一个键偏离属性名称,您就必须为每个属性定义一个编码键。

以下执行此操作并编译:

class User: Decodable {
let name: String
let email: String

private enum CodingKeys: String, CodingKey {
case name = "username"
case email
}
}

如果不指定 email关键,编译器不知道如何设置该属性,只有开发人员知道如何设置。因此,编译器不会为您合成它,而您必须这样做。

可能有一个自然默认值,如下所示:

class User: Decodable {
let name: String
let email: String

enum CodingKeys: String, CodingKey {
case name = "username"
}

required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)

name = try container.decode(String.self, forKey: .name)

// Default email:
email = "\(name)@example.com"
}
}

关于ios - 为什么为某些属性定义 CodingKeys 需要初始化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60329993/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com