gpt4 book ai didi

swift - 我可以使用 willSet 构造类实例字典条目吗?

转载 作者:行者123 更新时间:2023-11-28 06:01:38 26 4
gpt4 key购买 nike

我正在使用 xCode 9.2、Swift 4.1

鉴于这两个过度简化的类,目前有效:

class Prop : Codable {
var origin:String?
var result:String?

init(_ origin:String) {
self.origin = origin
}
}

class PropList : Codable {
var properties = [String: Prop]()

func set (property:String, origin:String) {
if properties[property] == nil {
properties[property] = Prop(origin) //Create the entry
} else {
properties[property]!.origin = origin //Update the entry
}
}
}

如果字典条目不存在,是否有任何方法可以使用 willSet 为 Prop 类创建一个实例?我试图对此进行编码,但传递给 willSet 的 newValue 实际上是一个完整的字典。我想这是假设多个条目可能同时发生变化,但我认为这实际上不会发生。这就是下面的部分解决方案迭代它的原因。

想要使用 willSet 的原因是我可以使用普通语法,而不是使用特殊的方法调用。使用上面的代码,我这样调用它:

var pl:PropList = PropList()
pl.set(property: "My Key", origin: "My Origin")
print(pl.properties["My Key"]?.origin as Any)

但我希望能够做到这一点:

var pl2:PropList = PropList()
pl2.properties["My Key"]?.origin = "My Origin"
print(pl2.properties["My Key"]?.origin as Any)

which results in nothing being stored, or:

var pl2:PropList = PropList()
pl2.properties["My Key"]!.origin = "My Origin"
print(pl2.properties["My Key"]?.origin as Any)

which throws a runtime error.

我认为这应该可行:

class PropList {
var properties = [String: Prop]() {
willSet {
for e in newValue {
if properties[e.key] == nil {
properties[e.key] = Prop()
}
}
}
}
}

但 Swift 不会在调用之前无法解析目标。

有什么办法解决这个问题吗?

最佳答案

您可以使用自定义下标对此进行很好的建模:

class Prop: Codable {
var origin: String?
var result: String?

init(_ origin: String) {
self.origin = origin
}
}

class PropList: Codable {
private var properties = [String: Prop]()

public subscript(_ property: String) -> String? {
get { return properties[property]?.origin }
set {
guard let unwrappedNewValue = newValue else {
fatalError("Handle me properly!")
}
if let existingProperty = properties[property] {
existingProperty.origin = unwrappedNewValue
properties[property] = existingProperty
} else {
properties[property] = Prop(unwrappedNewValue)
}
}
}
}

var propList = PropList()
propList["Some property"] = "Something called an 'origin' that needs to be better named/documented"

关于swift - 我可以使用 willSet 构造类实例字典条目吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49524790/

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