Skip to content

Instantly share code, notes, and snippets.

@MMnasrabadi
Created March 23, 2020 15:18
Show Gist options
  • Save MMnasrabadi/2258f563d7bf027aa624b8cf0ad0f7d7 to your computer and use it in GitHub Desktop.
Save MMnasrabadi/2258f563d7bf027aa624b8cf0ad0f7d7 to your computer and use it in GitHub Desktop.
extension on Codable
// Create by love : Mohammad Nasrabadi [github](https://github.com/mmnasrabadi)
import UIKit
protocol CodablePro: Codable {
func toJsonString() -> String
typealias JSON = [String : Any]
func toDictionary() -> JSON?
init?(json: JSON)
init?(data: Data)
init?(_ json: String, using encoding: String.Encoding)
init?(fromURL url: String)
init?(fromURL url: URL)
var jsonData: Data? { get }
var jsonString: String? { get }
}
// MARK: - CodablePro convenience initializers and mutators
extension CodablePro {
// MARK: toJsonString
/// Codable To Json String
func toJsonString() -> String{
let jsonEncoder = JSONEncoder()
let jsonData = try! jsonEncoder.encode(self)
let jsonString = String(data: jsonData, encoding: .utf8) ?? ""
return jsonString
}
// MARK: toDictionary
/// Can use this for send model with post : Parameters is a Dictionary so `parameters: model.toDictionary()?`
func toDictionary() -> JSON? {
// Encode the data
if let jsonData = try? JSONEncoder().encode(self),
// Create a dictionary from the data
let dict = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? JSON {
return dict
}
return nil
}
init?(json: JSON) {
do {
let data = try JSONSerialization.data(withJSONObject: json, options: [])
let object = try JSONDecoder().decode(Self.self, from: data)
self = object
} catch {
return nil
}
}
init?(data: Data) {
guard let object = try? JSONDecoder().decode(Self.self, from: data) else { return nil }
self = object
}
init?(_ json: String, using encoding: String.Encoding = .utf8) {
guard let data = json.data(using: encoding) else { return nil }
self.init(data: data)
}
init?(fromURL url: String) {
guard let url = URL(string: url) else { return nil }
guard let data = try? Data(contentsOf: url) else { return nil }
self.init(data: data)
}
init?(fromURL url: URL) {
guard let data = try? Data(contentsOf: url) else { return nil }
self.init(data: data)
}
var jsonData: Data? {
return try? JSONEncoder().encode(self)
}
var jsonString: String? {
guard let data = self.jsonData else { return nil }
return String(data: data, encoding: .utf8)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment