forked from shadowfacts/Tusker
Fix LazilyDecoding not handling top-level optionals
This commit is contained in:
parent
366378f267
commit
0249207dcc
|
@ -37,10 +37,10 @@ public struct LazilyDecoding<Enclosing, Value: Codable> {
|
||||||
} else {
|
} else {
|
||||||
guard let data = instance[keyPath: wrapper.keyPath] else { return wrapper.fallback }
|
guard let data = instance[keyPath: wrapper.keyPath] else { return wrapper.fallback }
|
||||||
do {
|
do {
|
||||||
let value = try decoder.decode(Value.self, from: data)
|
let value = try decoder.decode(Box<Value>.self, from: data)
|
||||||
wrapper.value = value
|
wrapper.value = value.value
|
||||||
instance[keyPath: storageKeyPath] = wrapper
|
instance[keyPath: storageKeyPath] = wrapper
|
||||||
return value
|
return value.value
|
||||||
} catch {
|
} catch {
|
||||||
return wrapper.fallback
|
return wrapper.fallback
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ public struct LazilyDecoding<Enclosing, Value: Codable> {
|
||||||
var wrapper = instance[keyPath: storageKeyPath]
|
var wrapper = instance[keyPath: storageKeyPath]
|
||||||
wrapper.value = newValue
|
wrapper.value = newValue
|
||||||
instance[keyPath: storageKeyPath] = wrapper
|
instance[keyPath: storageKeyPath] = wrapper
|
||||||
let newData = try? encoder.encode(newValue)
|
let newData = try! encoder.encode(Box(value: newValue))
|
||||||
instance[keyPath: wrapper.keyPath] = newData
|
instance[keyPath: wrapper.keyPath] = newData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,3 +62,11 @@ extension LazilyDecoding {
|
||||||
self.init(from: keyPath, fallback: [] as! Value)
|
self.init(from: keyPath, fallback: [] as! Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension LazilyDecoding {
|
||||||
|
// PropertyListEncoder only allows top-level types to be dicts or arrays, which breaks encoding nil-able values.
|
||||||
|
// Wrapping everything in a Box ensures that it's always a dict.
|
||||||
|
private struct Box<T: Codable>: Codable {
|
||||||
|
let value: T
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue