Created
March 23, 2020 15:18
-
-
Save MMnasrabadi/2258f563d7bf027aa624b8cf0ad0f7d7 to your computer and use it in GitHub Desktop.
extension on Codable
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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