gpt4 book ai didi

ios - 在 Swift 中使用可编码扩展更新对象属性

转载 作者:搜寻专家 更新时间:2023-10-31 22:54:29 35 4
gpt4 key购买 nike

首先让我说我已经实现了 Decodable,它将 JSON 解码为具有这两个 Integer 值的多个对象:

public class ARBufferData: DecoderUpdatable {

private var previousStation: Int
private var numberOfElements: Int

func update(from decoder: Decoder) throws {
//Still needs work
}
}

我现在想要实现的是使创建的对象可更新,这样当 JSON 中的值发生变化时(例如 numberOfElements),只有相应对象中的值会发生变化。我相信本指南可以让我做到这一点,但我在实现它时遇到了麻烦:Understanding and Extending Swift 4’s Codable

这是 KeyedDecodingContainer 的扩展:

extension KeyedDecodingContainer {
func update<T: DecoderUpdatable>(_ value: inout T, forKey key: Key, userInfo: Any) throws {
let nestedDecoder = NestedDecoder(from: self, key: key)
try value.update(from: nestedDecoder)
}
}

之所以有用,是因为我可以在该值上设置属性观察器并触发可视化的重绘。

如果有人能帮助我或指出正确的方向,我将不胜感激。

谢谢!

干杯

最佳答案

更新类有两种方法。第一,你自己解码每个 int 并进行比较。第二,您为 Int 实现 DecoderUpdatable 并以它们作为参数调用 container.update

public class ARBufferData: NSObject, Decodable, DecoderUpdatable {
init(previousStation: Int, numberOfElements: Int) {
self.previousStation = previousStation
self.numberOfElements = numberOfElements
}

@objc dynamic var previousStation: Int
@objc dynamic var numberOfElements: Int

private enum CodingKeys: String, CodingKey {
case previousStation, numberOfElements
}

public func update(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
try container.update(&previousStation, forKey: .previousStation)
try container.update(&numberOfElements, forKey: .numberOfElements)
}
}

extension Int: DecoderUpdatable {
public mutating func update(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let result = try container.decode(Int.self)
guard result != self else { return }
self = result
}
}

不过,我不知道博文作者是否有意这样做。如果他这样做了,那么为基本类型生成 DecoderUpdatable 一致性可能是 Sourcery 的一个用例,但这不是这里的主题。

在 Swift4 中有一种有趣的观察方式,您可能也对它感兴趣:

let token = buffer.observe(\.numberOfElements, options: [.new, .old]) {
object, change in
if change.oldValue != change.newValue {
// Act on change of buffer.numberOfElements.
}
}

Source

关于ios - 在 Swift 中使用可编码扩展更新对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51547512/

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