Struct to make simple [String: Any]
dictionaries conform to Codable
.
let data1: Data = try! Data(contentsOf: Bundle.main.url(forResource: "test", withExtension: "json")!)
let dict = try? JSONDecoder().decode(CodableDictionary.self, from: data)
let name = dict?["name"]
CodableDictionary
can be initialised with [String: Any].
let dict = CodableDictionary(value: ["foor": 233, "nested": ["n1": "hallo", "n2": "welt", "nested": ["n1": "hallo", "n2": "welt"]]])
let encodedData: Data = try! JSONEncoder().encode(dict)
let jsonString = String(data: encodedData, encoding: .utf8)
Encoding of custom models is also supported. So you can simply wrap models into a dictionary.
struct User: Codable {
let name: String
}
let user = User(name: "Stefan")
var userDict = CodableDictionary(value: ["user": user])
userDict.additionalEncoding = { (container, codingKey, value) in
if let user = value as? User {
try container.encode(user, forKey: codingKey)
}
}
let encodedData: Data = try! JSONEncoder().encode(userDict)
let jsonString = String(data: encodedData, encoding: .utf8)
Since CodableDictionary
has to know the type of model which has to be decoded/encoded, Any
has to be one of the following types:
supported types of Any |
---|
String, [String] |
Bool, [Bool] |
Int, [Int] |
Double, [Double] |
CodableDictionary |
Current Swift compatibility breakdown:
Swift Version | Framework Version |
---|---|
4.x | 1.x |
Add the following line to your Cartfile.
github "wieweb/CodableDictionary", ~> 1.0
Then run carthage update
.
Just drag and drop the CodableDictionary.swift
file in the CodableDictionary
folder into your project.
- Create something awesome, make the code better, add some functionality, whatever (this is the hardest part).
- Fork it
- Create new branch to make your changes
- Commit all your changes to your branch
- Submit a pull request
Contact me at [email protected]