如何初始化Codable ObservedObject



在SwiftUI中,我试图创建一个符合Codable的类(因此我可以将其保存在@AppStorage中),并具有@Published属性,因此它可以作为EnvironmentObject传递。

这个教程给了我下面的例子:

class User: ObservableObject, Codable {

enum CodingKeys: CodingKey {
case name
}

@Published var name = "Bob Smith"

required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
}

func encode(to encoder: Encoder) throws {
...
}
}

我想知道如何将String传递到类初始化器中。(即var user = User("Bob Smith")

除非我弄错了,required意味着所有实例&子类必须使用该初始化式。考虑到name已经在现有的初始化器中被赋值,我该如何将自定义名称传递到该类的初始化器中呢?

required意味着所有子类必须实现init,在这种情况下,这是一个要求,因为符合Codable

但这并不意味着你不能添加其他初始化器,这样你就可以从JSON以外的其他类型的数据创建类的实例

所以只需添加任何你需要的init

init(name: String) {
self.name = name
}
let user = User(name: "Joe")

对于一个子类,你必须添加一个init(from:),如果你想,你可以添加另一个自定义init,这里是一个例子

class SuperUser: User {
var likesBananas: Bool
enum CodingKeys: CodingKey {
case likesBananas
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
likesBananas = try container.decode(Bool.self, forKey: .likesBananas)
try super.init(from: decoder)
}
init(name: String, likesBananas: Bool) {
self.likesBananas = likesBananas
super.init(name: name)
}
override func encode(to encoder: Encoder) throws {...}
}

相关内容

  • 没有找到相关文章

最新更新