CodableExtensions 0.3.0

CodableExtensions 0.3.0

TestsTested
LangLanguage SwiftSwift
License MIT
ReleasedLast Release Jun 2019
SPMSupports SPM

Maintained by James Ruston.



CodableExtensions

Version License Platform Carthage compatible

Installation

CodableExtensions is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'CodableExtensions'

and run

pod install

Usage

Decoding

To make a custom decoding transformer, you just need to implement DecodingContainerTransformer An example is provided in the project for converting a Regex

import CodableExtensions

public class RegexCodableTransformer: DecodingContainerTransformer {
    
    public typealias Input = String
    public typealias Output = NSRegularExpression
    
    public init() {}
    
    public func transform(_ decoded: Input) throws -> Output {
        return try NSRegularExpression(pattern: decoded, options: [])
    }
}

The Input and Output types need defining to match the type you expect to be converting from and to, in this case the input is a String and the output is an NSRegularExpression.

The logic to perfrom the transformation is then performed in the transform function. If there's an error at any point then that needs to be thrown.

The custom transformer can then be used in the Decodable initialiser

init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        regex = try container.decode(.regex, transformer: RegexCodableTransformer())
}

Encoding

To make a custom encoding transformer, make a class implementing EncodingContainerTransformer

Example encoding an NSRegularExpression

class RegexCodableTransformer: EncodingContainerTransformer {

    typealias Input = String
    typealias Output = NSRegularExpression
    
    public func transform(_ encoded: Output) throws -> Input {
        return encoded.pattern
    }
}

and to use this transformer implement the Encodable function encode(to encoder: Encoder)

func encode(to encoder: Encoder) throws {
        var container =  encoder.container(keyedBy: CodingKeys.self)
        try container.encode(regex, forKey: .regex, transformer: RegexCodableTransformer())
}

If your transformer conforms to both the EncodingContainerTransformer and DecodingContainerTransformer you can use the CodingContainerTransformer typealias

For full examples check out the tests https://github.com/jamesruston/CodableExtensions/blob/master/Example/Tests/Tests.swift

For a writeup on the motivation behind this library check my Medium article out https://medium.com/@James_Ruston/codable-vs-objectmapper-af5fe8e8efd5

Installation

Cocoapods

CodableExtensions is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'CodableExtensions'

Run pod install to integrate CodableExtensions with your workspace.

Carthage

CodableExtensions is available through Carthage. To install it, simply add the following line to your Carthage file:

github "jamesruston/CodableExtensions"  

Run carthage update to build the framework and drag the built CodableExtensions.framework into your Xcode project.

Author

https://medium.com/@James_Ruston/

License

CodableExtensions is available under the MIT license. See the LICENSE file for more info.