Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.52 KB | None | 0 0
  1. class Server : Codable {
  2. var id : Int?
  3. }
  4.  
  5. class Development : Server {
  6. var name : String?
  7. var userId : Int?
  8. }
  9.  
  10. var json = "{"id" : 1,"name" : "Large Building Development"}"
  11. let jsonDecoder = JSONDecoder()
  12. let item = try jsonDecoder.decode(Development.self, from:json.data(using: .utf8)!) as Development
  13.  
  14. print(item.id ?? "id is nil")
  15. print(item.name ?? "name is nil") here
  16.  
  17. 1
  18. name is nil
  19.  
  20. class Server {
  21. var id : Int?
  22. }
  23.  
  24. class Development : Server, Codable {
  25. var name : String?
  26. var userId : Int?
  27. }
  28.  
  29. var json = "{"id" : 1,"name" : "Large Building Development"}"
  30. let jsonDecoder = JSONDecoder()
  31. let item = try jsonDecoder.decode(Development.self, from:json.data(using: .utf8)!) as Development
  32.  
  33. print(item.id ?? "id is nil")
  34. print(item.name ?? "name is nil")
  35.  
  36. id is nil
  37. Large Building Development
  38.  
  39. required init(from decoder: Decoder) throws {
  40.  
  41. // Get our container for this subclass' coding keys
  42. let container = try decoder.container(keyedBy: CodingKeys.self)
  43. myVar = try container.decode(MyType.self, forKey: .myVar)
  44. // otherVar = ...
  45.  
  46. // Get superDecoder for superclass and call super.init(from:) with it
  47. let superDecoder = try container.superDecoder()
  48. try super.init(from: superDecoder)
  49.  
  50. }
  51.  
  52. //: Fully-Implemented Inheritance
  53.  
  54. class FullSuper: Codable {
  55.  
  56. var id: UUID?
  57.  
  58. init() {}
  59.  
  60. private enum CodingKeys: String, CodingKey { case id }
  61.  
  62. required init(from decoder: Decoder) throws {
  63.  
  64. let container = try decoder.container(keyedBy: CodingKeys.self)
  65. id = try container.decode(UUID.self, forKey: .id)
  66.  
  67. }
  68.  
  69. func encode(to encoder: Encoder) throws {
  70.  
  71. var container = encoder.container(keyedBy: CodingKeys.self)
  72. try container.encode(id, forKey: .id)
  73.  
  74. }
  75.  
  76. }
  77.  
  78. class FullSub: FullSuper {
  79.  
  80. var string: String?
  81. private enum CodingKeys: String, CodingKey { case string }
  82.  
  83. override init() { super.init() }
  84.  
  85. required init(from decoder: Decoder) throws {
  86.  
  87. let container = try decoder.container(keyedBy: CodingKeys.self)
  88. let superdecoder = try container.superDecoder()
  89. try super.init(from: superdecoder)
  90.  
  91. string = try container.decode(String.self, forKey: .string)
  92.  
  93. }
  94.  
  95. override func encode(to encoder: Encoder) throws {
  96.  
  97. var container = encoder.container(keyedBy: CodingKeys.self)
  98. try container.encode(string, forKey: .string)
  99.  
  100. let superencoder = container.superEncoder()
  101. try super.encode(to: superencoder)
  102.  
  103. }
  104. }
  105.  
  106. let fullSub = FullSub()
  107. fullSub.id = UUID()
  108. fullSub.string = "FullSub"
  109.  
  110. let fullEncoder = PropertyListEncoder()
  111. let fullData = try fullEncoder.encode(fullSub)
  112.  
  113. let fullDecoder = PropertyListDecoder()
  114. let fullSubDecoded: FullSub = try fullDecoder.decode(FullSub.self, from: fullData)
  115.  
  116. override func encode(to encoder: Encoder) throws {
  117. try super.encode(to: encoder)
  118. var container = encoder.container(keyedBy: CodingKeys.self)
  119. try container.encode(employeeID, forKey: .employeeID)
  120. }
  121.  
  122. required init(from decoder: Decoder) throws {
  123.  
  124. try super.init(from: decoder)
  125.  
  126. let values = try decoder.container(keyedBy: CodingKeys.self)
  127. total = try values.decode(Int.self, forKey: .total)
  128. }
  129.  
  130. private enum CodingKeys: String, CodingKey
  131. {
  132. case total
  133.  
  134. }
  135.  
  136. protocol Parent: Codable {
  137. var inheritedProp: Int? {get set}
  138. }
  139.  
  140. struct Child: Parent {
  141. var inheritedProp: Int?
  142. var title: String?
  143.  
  144. enum CodingKeys: String, CodingKey {
  145. case inheritedProp = "inherited_prop"
  146. case title = "short_title"
  147. }
  148. }
  149.  
  150. import TypePreservingCodingAdapter
  151. import Foundation
  152.  
  153. // redeclared your types with initializers
  154. class Server: Codable {
  155. var id: Int?
  156.  
  157. init(id: Int?) {
  158. self.id = id
  159. }
  160. }
  161.  
  162. class Development: Server {
  163. var name: String?
  164. var userId: Int?
  165.  
  166. private enum CodingKeys: String, CodingKey {
  167. case name
  168. case userId
  169. }
  170.  
  171. init(id: Int?, name: String?, userId: Int?) {
  172. self.name = name
  173. self.userId = userId
  174. super.init(id: id)
  175. }
  176.  
  177. required init(from decoder: Decoder) throws {
  178. try super.init(from: decoder)
  179. let container = try decoder.container(keyedBy: CodingKeys.self)
  180.  
  181. name = try container.decodeIfPresent(String.self, forKey: .name)
  182. userId = try container.decodeIfPresent(Int.self, forKey: .userId)
  183. }
  184.  
  185. override func encode(to encoder: Encoder) throws {
  186. try super.encode(to: encoder)
  187. var container = encoder.container(keyedBy: CodingKeys.self)
  188.  
  189. try container.encode(name, forKey: .name)
  190. try container.encode(userId, forKey: .userId)
  191. }
  192.  
  193. }
  194.  
  195. // create and adapter
  196. let adapter = TypePreservingCodingAdapter()
  197. let encoder = JSONEncoder()
  198. let decoder = JSONDecoder()
  199.  
  200. // inject it into encoder and decoder
  201. encoder.userInfo[.typePreservingAdapter] = adapter
  202. decoder.userInfo[.typePreservingAdapter] = adapter
  203.  
  204. // register your types with adapter
  205. adapter.register(type: Server.self).register(type: Development.self)
  206.  
  207.  
  208. let server = Server(id: 1)
  209. let development = Development(id: 2, name: "dev", userId: 42)
  210.  
  211. let servers: [Server] = [server, development]
  212.  
  213. // wrap specific object with Wrap helper object
  214. let data = try! encoder.encode(servers.map { Wrap(wrapped: $0) })
  215.  
  216. // decode object back and unwrap them force casting to a common ancestor type
  217. let decodedServers = try! decoder.decode([Wrap].self, from: data).map { $0.wrapped as! Server }
  218.  
  219. // check that decoded object are of correct types
  220. print(decodedServers.first is Server) // prints true
  221. print(decodedServers.last is Development) // prints true
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement