Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Server : Codable {
- var id : Int?
- }
- class Development : Server {
- var name : String?
- var userId : Int?
- }
- var json = "{"id" : 1,"name" : "Large Building Development"}"
- let jsonDecoder = JSONDecoder()
- let item = try jsonDecoder.decode(Development.self, from:json.data(using: .utf8)!) as Development
- print(item.id ?? "id is nil")
- print(item.name ?? "name is nil") here
- 1
- name is nil
- class Server {
- var id : Int?
- }
- class Development : Server, Codable {
- var name : String?
- var userId : Int?
- }
- var json = "{"id" : 1,"name" : "Large Building Development"}"
- let jsonDecoder = JSONDecoder()
- let item = try jsonDecoder.decode(Development.self, from:json.data(using: .utf8)!) as Development
- print(item.id ?? "id is nil")
- print(item.name ?? "name is nil")
- id is nil
- Large Building Development
- required init(from decoder: Decoder) throws {
- // Get our container for this subclass' coding keys
- let container = try decoder.container(keyedBy: CodingKeys.self)
- myVar = try container.decode(MyType.self, forKey: .myVar)
- // otherVar = ...
- // Get superDecoder for superclass and call super.init(from:) with it
- let superDecoder = try container.superDecoder()
- try super.init(from: superDecoder)
- }
- //: Fully-Implemented Inheritance
- class FullSuper: Codable {
- var id: UUID?
- init() {}
- private enum CodingKeys: String, CodingKey { case id }
- required init(from decoder: Decoder) throws {
- let container = try decoder.container(keyedBy: CodingKeys.self)
- id = try container.decode(UUID.self, forKey: .id)
- }
- func encode(to encoder: Encoder) throws {
- var container = encoder.container(keyedBy: CodingKeys.self)
- try container.encode(id, forKey: .id)
- }
- }
- class FullSub: FullSuper {
- var string: String?
- private enum CodingKeys: String, CodingKey { case string }
- override init() { super.init() }
- required init(from decoder: Decoder) throws {
- let container = try decoder.container(keyedBy: CodingKeys.self)
- let superdecoder = try container.superDecoder()
- try super.init(from: superdecoder)
- string = try container.decode(String.self, forKey: .string)
- }
- override func encode(to encoder: Encoder) throws {
- var container = encoder.container(keyedBy: CodingKeys.self)
- try container.encode(string, forKey: .string)
- let superencoder = container.superEncoder()
- try super.encode(to: superencoder)
- }
- }
- let fullSub = FullSub()
- fullSub.id = UUID()
- fullSub.string = "FullSub"
- let fullEncoder = PropertyListEncoder()
- let fullData = try fullEncoder.encode(fullSub)
- let fullDecoder = PropertyListDecoder()
- let fullSubDecoded: FullSub = try fullDecoder.decode(FullSub.self, from: fullData)
- override func encode(to encoder: Encoder) throws {
- try super.encode(to: encoder)
- var container = encoder.container(keyedBy: CodingKeys.self)
- try container.encode(employeeID, forKey: .employeeID)
- }
- required init(from decoder: Decoder) throws {
- try super.init(from: decoder)
- let values = try decoder.container(keyedBy: CodingKeys.self)
- total = try values.decode(Int.self, forKey: .total)
- }
- private enum CodingKeys: String, CodingKey
- {
- case total
- }
- protocol Parent: Codable {
- var inheritedProp: Int? {get set}
- }
- struct Child: Parent {
- var inheritedProp: Int?
- var title: String?
- enum CodingKeys: String, CodingKey {
- case inheritedProp = "inherited_prop"
- case title = "short_title"
- }
- }
- import TypePreservingCodingAdapter
- import Foundation
- // redeclared your types with initializers
- class Server: Codable {
- var id: Int?
- init(id: Int?) {
- self.id = id
- }
- }
- class Development: Server {
- var name: String?
- var userId: Int?
- private enum CodingKeys: String, CodingKey {
- case name
- case userId
- }
- init(id: Int?, name: String?, userId: Int?) {
- self.name = name
- self.userId = userId
- super.init(id: id)
- }
- required init(from decoder: Decoder) throws {
- try super.init(from: decoder)
- let container = try decoder.container(keyedBy: CodingKeys.self)
- name = try container.decodeIfPresent(String.self, forKey: .name)
- userId = try container.decodeIfPresent(Int.self, forKey: .userId)
- }
- override func encode(to encoder: Encoder) throws {
- try super.encode(to: encoder)
- var container = encoder.container(keyedBy: CodingKeys.self)
- try container.encode(name, forKey: .name)
- try container.encode(userId, forKey: .userId)
- }
- }
- // create and adapter
- let adapter = TypePreservingCodingAdapter()
- let encoder = JSONEncoder()
- let decoder = JSONDecoder()
- // inject it into encoder and decoder
- encoder.userInfo[.typePreservingAdapter] = adapter
- decoder.userInfo[.typePreservingAdapter] = adapter
- // register your types with adapter
- adapter.register(type: Server.self).register(type: Development.self)
- let server = Server(id: 1)
- let development = Development(id: 2, name: "dev", userId: 42)
- let servers: [Server] = [server, development]
- // wrap specific object with Wrap helper object
- let data = try! encoder.encode(servers.map { Wrap(wrapped: $0) })
- // decode object back and unwrap them force casting to a common ancestor type
- let decodedServers = try! decoder.decode([Wrap].self, from: data).map { $0.wrapped as! Server }
- // check that decoded object are of correct types
- print(decodedServers.first is Server) // prints true
- print(decodedServers.last is Development) // prints true
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement