All Projects → CNKCQ → AlamofireCodable

CNKCQ / AlamofireCodable

Licence: MIT license
An Alamofire extension which converts JSON response data into swift objects using Codable

Programming Languages

swift
15916 projects
ruby
36898 projects - #4 most used programming language

Projects that are alternatives of or similar to AlamofireCodable

Swiftdb
A modern database abstraction layer, batteries included.
Stars: ✭ 183 (+289.36%)
Mutual labels:  codable
TrickerX
An Xcode9+ Extension which make CodingKeys automatically.
Stars: ✭ 90 (+91.49%)
Mutual labels:  codable
FTAPIKit
Declarative and generic REST API framework using Codable.
Stars: ✭ 18 (-61.7%)
Mutual labels:  codable
Codable Diy Kit
A template for creating your own Swift Codable encoders and decoders
Stars: ✭ 207 (+340.43%)
Mutual labels:  codable
Stuff
A collection of Swift code 'snippets' that are too small to create a library for and which do not fit in an other library.
Stars: ✭ 41 (-12.77%)
Mutual labels:  codable
json2codable
A command line tool to generate a Swift Codable struct from a JSON document
Stars: ✭ 19 (-59.57%)
Mutual labels:  codable
Regularexpressiondecoder
A decoder that constructs objects from regular expression matches.
Stars: ✭ 169 (+259.57%)
Mutual labels:  codable
FireSnapshot
A useful Firebase-Cloud-Firestore Wrapper with Codable.
Stars: ✭ 56 (+19.15%)
Mutual labels:  codable
CodablePerformance
Performance benchmarks for Codable and JSONSerialization
Stars: ✭ 68 (+44.68%)
Mutual labels:  codable
WXKDarkSky
A pure-Swift Codable layer over the Dark Sky API.
Stars: ✭ 21 (-55.32%)
Mutual labels:  codable
Codablecsv
Read and write CSV files row-by-row or through Swift's Codable interface.
Stars: ✭ 214 (+355.32%)
Mutual labels:  codable
Keyedcodable
Easy nested key mappings for swift Codable
Stars: ✭ 248 (+427.66%)
Mutual labels:  codable
CodableWrapper
@codec("encoder", "decoder") var cool: Bool = true
Stars: ✭ 143 (+204.26%)
Mutual labels:  codable
Codablewrappers
A Collection of PropertyWrappers to make custom Serialization of Swift Codable Types easy
Stars: ✭ 197 (+319.15%)
Mutual labels:  codable
CodablePersist
Store and Cache Anything Codable
Stars: ✭ 18 (-61.7%)
Mutual labels:  codable
Cleanjson
Swift JSON decoder for Codable
Stars: ✭ 178 (+278.72%)
Mutual labels:  codable
JSONFeed
A Swift encoder and decoder for the JSON Feed format
Stars: ✭ 51 (+8.51%)
Mutual labels:  codable
AC-iOS-Codeable-and-UserDefaults
No description or website provided.
Stars: ✭ 16 (-65.96%)
Mutual labels:  codable
codable-kit
Conveniences for working with Swift's Codable protocols.
Stars: ✭ 19 (-59.57%)
Mutual labels:  codable
QuickDB
A Generic CoreData Manager to accept any type of objects. Fastest way for adding a Database to your project.
Stars: ✭ 16 (-65.96%)
Mutual labels:  codable

CI Status Version Platform

AlamofireCodable: An extension to Alamofire which automatically converts JSON response data into swift objects using Codable. This project is heavily inspired by the popular AlamofireObjectMapper.

image.png

Installation

AlamofireCodable can be added to your project using CocoaPods by adding the following line to your Podfile:

pod 'AlamofireCodable'

Example

To run the example project, clone the repo, and run pod install from the Example directory first.

Requirements

Xcode 9+ , Swift 4+

Usage

Given a URL which returns weather data in the following form:

{  
   "data":{  
      "location":"Toronto, Canada",
      "three_day_forecast":[  
         {  
            "conditions":"Partly cloudy",
            "day":"Monday",
            "temperature":20
         },
         {  
            "conditions":"Showers",
            "day":"Tuesday",
            "temperature":22
         },
         {  
            "conditions":"Sunny",
            "day":"Wednesday",
            "temperature":28
         }
      ]
   }
}

You can use the extension as the follows:

import AlamofireCodable

        let form = WeatherForm()
        Alamofire.request(
                form.url,
                method: HTTPMethod.get,
                parameters: form.parameters(),
                encoding: form.encoding(),
                headers: form.headers()
            )
            .responseObject(keyPath: "data",completionHandler: { (response: DataResponse<Weather>) in
                switch response.result {
                case .success(let object):
                    debugPrint("🌹", object.location)
                case .failure(let error):
                    debugPrint("🌹", error.localizedDescription)
                }
            })

The Weather object in the completion handler is a custom object which you define. The only requirement is that the object must conform to Codable protocol. In the above example, the Weather object looks like the following:

{  
   "data":{  
      "location":"Toronto, Canada",
      "three_day_forecast":[  
         {  
            "conditions":"Partly cloudy",
            "day":"Monday",
            "temperature":20
         },
         {  
            "conditions":"Showers",
            "day":"Tuesday",
            "temperature":22
         },
         {  
            "conditions":"Sunny",
            "day":"Wednesday",
            "temperature":28
         }
      ]
   }
}

The extension uses Generics to allow you to create your own custom response objects. Below is the responseObject function definition. Just replace T in the completionHandler with your custom response object and the extension handles the rest:

public func responseObject<T: Codable>(queue: DispatchQueue? = nil, keyPath: String? = nil,  completionHandler: @escaping (DataResponse<T>) -> Void) -> Self 

The responseObject function has 2 optional parameters and a required completionHandler:

  • queue: The queue on which the completion handler is dispatched.
  • keyPath: The key path of the JSON where object mapping should be performed
  • completionHandler: A closure to be executed once the request has finished and the data has been decoded by JSONDecoder.

Easy decode of Nested Objects

AlamofireCodable supports dot notation within keys for easy mapping of nested objects. Given the following JSON String:

{  
   "data":{  
      "location":"Toronto, Canada",
      "three_day_forecast":[  
         {  
            "conditions":"Partly cloudy",
            "day":"Monday",
            "temperature":20
         },
         {  
            "conditions":"Showers",
            "day":"Tuesday",
            "temperature":22
         },
         {  
            "conditions":"Sunny",
            "day":"Wednesday",
            "temperature":28
         }
      ]
   }
}

You can access the nested objects as follows:

      let form = WeatherForm()
        Alamofire.request(
            form.url,
            method: HTTPMethod.get,
            parameters: form.parameters(),
            encoding: form.encoding(),
            headers: form.headers()
            )
            .responseObject(completionHandler: { (response: DataResponse<RootModel>) in
                switch response.result {
                case .success(let root):
                    debugPrint("🌹", root)
                case .failure(let error):
                    debugPrint("🌹", error.localizedDescription)
                }
            })

KeyPath

The keyPath variable is used to drill down into a JSON response and only map the data found at that keyPath. It supports nested values such as data.three_day_forecast to drill down several levels in a JSON response.

let form = WeatherForm()
        Alamofire.request(
                form.url,
                method: HTTPMethod.get,
                parameters: form.parameters(),
                encoding: form.encoding(),
                headers: form.headers()
            )
            .responseArray(keyPath: "data.three_day_forecast", completionHandler: { (response: DataResponse<[Forecast]>) in
                switch response.result {
                case .success(let array):
                    debugPrint("🌹", array)
                case .failure(let error):
                    debugPrint("🌹", error.localizedDescription)
                }
            })

Array Responses

If you have an endpoint that returns data in Array form you can map it with the following function:

public func responseArray<T: Codable>(queue: DispatchQueue? = nil, keyPath: String? = nil, completionHandler: @escaping (DataResponse<[T]>) -> Void) -> Self 

For example, if your endpoint returns the following:

[
    { 
        "conditions": "Partly cloudy",
        "day" : "Monday",
        "temperature": 20 
    },
    { 
        "conditions": "Showers",
        "day" : "Tuesday",
        "temperature": 22 
    },
    { 
        "conditions": "Sunny",
        "day" : "Wednesday",
        "temperature": 28 
    }
]

You can request and map it as follows:

        let form = WeatherForm()
        Alamofire.request(
                form.url,
                method: HTTPMethod.get,
                parameters: form.parameters(),
                encoding: form.encoding(),
                headers: form.headers()
            )
            .responseArray(keyPath: "data.three_day_forecast", completionHandler: { (response: DataResponse<[Forecast]>) in
                switch response.result {
                case .success(let array):
                    debugPrint("🌹", array)
                case .failure(let error):
                    debugPrint("🌹", error.localizedDescription)
                }
            })

Author

[email protected], [email protected]

License

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

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].