Hello everyone,
I’m suggesting to add a new way to encode/decode JSON properties for relevantly
complex data formats such as regular expressions, well-known text, hex colours,
custom date formats.
The problem:
Image you have a struct called House
struct House {
let color: UIColor
}
and it has a properly called color and the color represented in JSON as hex
value (#ffffff). Currently to make it working you have to extract the underline
value (string with a hex value) and then try to make a UIColor from it. It
works but it makes you to copy/past a lot of code and it leads to problems.
Also it shifts focus from what to decode to how to decode.
The suggested solution:
I suggest that we have to introduce protocols for classes that will encapsulate
transformation from a source data type to a destination data type. The source
data types are all existing data that support of decoding.
We will provide only protocols (one for decoding and one for encoding) and
users will be able to create transformers for their own data types.
The implementation:
The implementation is fairly easy. We only need introduce two protocols
(encoding/decoding) and add a method to KeyedEncodingContainerProtocol that
will accept a key and a transformer. In the method we will extract source data
from JSON and then will ask the transformer to try to convert it to the desire
data type.
Example of the decoding protocol:
protocol DecodingTransformer {
associatedtype Input: Decodable
associatedtype Output
func transform(_ decoded: Input) throws -> Output
}
Inspired by: https://github.com/Hearst-DD/ObjectMapper#custom-transforms
<https://github.com/Hearst-DD/ObjectMapper#custom-transforms>
Cheers,
Arsen
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution