[swift-users] No Generic Decoders?
Itai Ferber
iferber at apple.com
Tue Sep 5 11:53:13 CDT 2017
Hi Jon,
This was a conscious choice in the API design, for three main reasons:
1. There is a big difference between the API surface exposed at the
top-level for encoding and decoding and the middle levels. A method like
`decode(_ type: T, from data: Data)` is really only appropriate at the
top level of a given decoder, and likewise, exposing individual encoding
and decoding containers is really only appropriate at the middle levels.
We intentionally left these APIs separate to avoid exposing methods in
inappropriate places (so the `Decoder` protocol doesn’t expose the
top-level method)
2. Among top-level interfaces, there is variability in what different
decoders can expose. `JSONDecoder`, for instance, exposes only a
`decode(_ type: T, from data: Data)` method, while `PropertyListDecoder`
has another method which also exposes the
`PropertyListSerialization.PropertyListFormat` of the decoded data,
which would not be appropriate to expose on `JSONDecoder`. In the
future, these two might diverge further if we decide to specify the API
even further, but more importantly, other decoders might find a
different top-level API to be more appropriate than these methods (e.g.
a format which only allows top-level dictionaries might want to expose
only a decode method which accepts a dictionary type)
3. Given that, we found that it would be too confusing to expose
top-level encoders and decoders as a separate type from
`Encoder`/`Decoder` for not much benefit
If you find the concept useful for your own work and are willing to
sacrifice some portability, you can always define a protocol with the
interface appropriate for your project and have these decoders conform
to that protocol.
— Itai
On 2 Sep 2017, at 18:47, Jon Shier via swift-users wrote:
> Swift Users:
> I’ve been exploring the creation of Decodable response serializers
> for Alamofire. However, there doesn’t actually seem to be any way to
> express the notion of a generic decoder. The Decoder protocol itself
> doesn’t require a `decode(type:from:)` method, and neither
> JSONDecoder or PropertyListDecoder conform to Decoder in the first
> place. Were these facts conscious choices or oversights? It certainly
> seems very useful to be able to treat decoders generically.
>
>
>
> Jon Shier
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170905/262bf7c4/attachment.html>
More information about the swift-users
mailing list