在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 {...}
}