CodableExtension contains helper methods for Decodable objects.
The Codable documention from Apple is already very good and the Codable library from the Standard Swift Library in my opinion is exceptional.
Everything can always be made easier, therefore I have made these extensions which allow for me to write even less code than what we do already.
The examples below are based upon a Person object.
The Person object has one member property and this is labelled name with a type of String?.
Very simple huh!
public class Person: Codable {
public var name: String?
public init() {}
...
/// decode and encode methods
...
}As you can see my Person object implements the swift 4 Codable protocol.
do {
let data = try JSONSerialization.data(withJSONObject: withDictionary)
return try JSONDecoder().decode(self, from: data)
} catch {
return nil
}guard let person = Person.load(withDictionary: dictionary ) else {
return nil
}- Xcode 9.2
- Minimum iOS Deploment Target 9.0
- Swift 4.0
CodableExtensions doesn't contain any external dependencies.
These are currently the supported options:
Not yet supported but coming very soon
Not yet supported but coming very soon
Tested with swift build --version: Swift 4.0.0-dev (swiftpm-13126)
Create a Package.swift file.
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "PACKAGE_NAME",
dependencies: [
.package(url: "https://github.com/davidthorn/SwiftCodableExtensions.git", from: "0.1.0")
],
targets: [
.target(name: "PACKAGE_NAME", dependencies: [
"CodableExtensions"
])
]
)$ swift build
To me the most basic way for someone to want to do this is with taking a simple JSON String, NSDictionary, HashableDictionary or Data object and saying hey give me a decoded object from that in one line of code.
Well with a few methods it is possible.
let jsonData: Data = .... // Load the json Data from a server/api etc
guard let person: Person = Person.decode(withJSONData: jsonData) else {
return nil
}let dictionary: NSDictionary = [
"name" : "david"
]
guard let person: Person = Person.decode(withDictionary: dictionary ) else {
return nil
}let dictionary: [AnyHashable:Any] = [
"name" : "david"
]
guard let person: Person = Person.decode(withHashableDictionary: dictionary ) else {
return nil
}let jsonString = """
{
"name" : "david"
}
"""
guard let person = Person.decode(withJsonString: jsonString) else {
return nil
}