gpt4 book ai didi

swift - WrapperOfNSCoding 因单个值而失败

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

来自 Implementing Codable for UIColor 的问题

    struct WrapperOfNSCoding<Wrapped>: Codable where Wrapped: NSCoding {
var wrapped: Wrapped

init(_ wrapped: Wrapped) { self.wrapped = wrapped }

init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let data = try container.decode(Data.self)
guard let object = NSKeyedUnarchiver.unarchiveObject(with: data) else {
throw DecodingError.dataCorruptedError(in: container, debugDescription: "failed to unarchive an object")
}
guard let wrapped = object as? Wrapped else {
throw DecodingError.typeMismatch(Wrapped.self, DecodingError.Context(codingPath: container.codingPath, debugDescription: "unarchived object type was \(type(of: object))"))
}
self.wrapped = wrapped
}

func encode(to encoder: Encoder) throws {
let data = NSKeyedArchiver.archivedData(withRootObject: wrapped)
var container = try encoder.singleValueContainer()
try container.encode(data)
}
}

let colors = [NSColor.red, NSColor.brown]
print(colors)
let w = WrapperOfNSCoding(colors[0])
let jsonData = try! JSONEncoder().encode(w) - fails
let jsonData = try! JSONEncoder().encode(colors.map({ WrapperOfNSCoding($0) })) - succeeds

print(jsonData)
let colors2 = try! JSONDecoder().decode([WrapperOfNSCoding<NSColor>].self, from: jsonData).map({ $0.wrapped })
print(colors2)

错误是在编码器中使用单个值时

let w = WrapperOfNSCoding(colors[0])
let jsonData = try! JSONEncoder().encode(w)

错误是

Fatal error: 'try!' expression unexpectedly raised an error: Swift.EncodingError.invalidValue(WrapperOfNSCoding #1...

成功了

let w = WrapperOfNSCoding([colors[0]])
let jsonData = try! JSONEncoder().encode(w)

为什么会这样

最佳答案

JSONEncoder 需要顶层的有效 JSON 上下文,它可以是 [:](字典)或 [](数组) , 你可以在里面放置一个元素,就像这个例子中的 string.

当您保存任何 NSCoding 对象时,编译器将该对象视为字符串。在 JSONEncoder().encode(w) 的情况下,您正在尝试编码一个 NSCoding 对象,该对象充当 string 对象而不是常规 JSON 对象。

JSONEncoder().encode([w]) 的情况下,对象创建了一个数组,每个元素都有一个字符串,在您的情况下是 NSCoding .

换句话说,w 数据是一个字符串,[w] 是一个数组,每个索引都有一个字符串,因此 JSONEncoder[w] 不会给你一个错误,而 w 不会给你一个错误。

关于swift - WrapperOfNSCoding 因单个值而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330725/

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