Swiftpack.co - antofic/GraphCodable as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by antofic.
antofic/GraphCodable 0.4.0
GraphCodable is an experimental Swift encode/decode package that does not treat reference types as second-class citizens.
⭐️ 8
🕓 14 weeks ago
iOS macOS watchOS tvOS
.package(url: "https://github.com/antofic/GraphCodable.git", from: "0.4.0")

GraphCodable

Firstly, I apologize for my poor English. I hope the content remains understandable.

GraphCodable is a Swift encode/decode package (similar to Codable at interface level) that does not treat reference types as second-class citizens.

With version 0.3.0 and later versions, the package has been completely revised. It now relies on _mangledTypeName(...) (when available) and NSStringFromClass(...) to generate the "type name" and on _typeByName(...) and NSClassFromString(...) to retrieve the class type from it.

With version 0.4.0 and later versions, GraphCodable supports identity for archiviving value types, to avoid duplication of their data. See the GIdentifiable protocol.

Features

GraphCodable:

  • encodes type information (for reference types);
  • supports reference inheritance;
  • never duplicates the same object (as defined by ObjectIdentifier);
  • in other words, it preserves the structure and the types of your model unaltered during encoding and decoding;
  • is fully type checked at compile time (*);
  • supports keyed and unkeyed coding, also usable simultaneously;
  • supports conditional encoding;
  • implements an userInfo dictionary;
  • implements a reference type version system;
  • implements a reference type substitution system during decode;
  • supports value types with identities, to avoid duplication of their data;

Check code examples in the User Guide. Check the tests section, too.

(*) Full type checking at compile time is mutually exclusive with the ability to encode/decode heterogeneous collections (i.e. [Any]) containing 'codable' elements. I chose to support the first feature while giving up the second.

Other information

Most Swift Standard Library and Foundation types are supported now. The list is here.

GraphCodable can encode and decode any Swift object graph, regardless of how complex it is, reconstructing its original structure with its original types without duplicating objects. If the reference types form an acyclic graph, only decode should be used in the init (from: GDecoder) method. If the reference types form a cyclic graph, deferDecode must be used in the init (from: GDecoder) method to "break" the cycle.

GraphCodable does not use a public format for the data (such as JSON or others) but stores the data in a private binary format defined by the package itself. Having to preserve information about the types, GraphCodable creates larger data in bytes than those generated by Codable encoders. Despite this, the time required for encoding and decoding is generally comparable if not faster.

GraphCodable is written entirely in Swift. The use of 'unsafe' methods is limited to a handful of functions related to reading and writing data in binary format (see BinaryIO). Everything else is 'safe'.

Be aware

For now, the data format may be subject to future changes.

Other documents

Simple interface comparison to Swift Codable

In GraphCodable:

  • GCodable have the same roles as Codable
  • GEncoder, GDecoder have the same roles as Encoder, Decoder
  • GraphEncoder has the same role as JSONEncoder, PropertyListEncoder
  • GraphDecoder has the same role as JSONDecoder, PropertyListDecoder

GraphCodable does not use containers.

Supported technologies

  • Swift 5.6

Changelog

Check it here.

License

GraphCodable is released under the MIT license. See LICENSE for more details.

GitHub

link
Stars: 8
Last commit: 1 week ago
jonrohan Something's broken? Yell at me @ptrpavlik. Praise and feedback (and money) is also welcome.

Release Notes

Value Identity for Encoding/Decoding
14 weeks ago

Support for Value Identity for Encoding/Decoding. See GIdentifiable protocol.

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics