рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ 4 рдореЗрдВ рдХреЛрдбреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛



JSON рдкреНрд░рд╛рд░реВрдк рдиреЗ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдФрд░ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред JSON рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЯреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ Apple рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо JSON рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдбрд┐рдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦреЗрдВрдЧреЗ , рдирдП рдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рддреБрд▓рдирд╛ рдЕрдкрдиреЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА NSCoding рдХреЗ рд╕рд╛рде рдХрд░реЗрдВрдЧреЗ , рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВрдЧреЗ , рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╣рд░ рдЪреАрдЬ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЖрдИ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред


рдХреЛрдбреЗрдмрд▓ рдХреНрдпрд╛ рд╣реИ?

WWDC2017 рдореЗрдВ, рд╕реНрд╡рд┐рдлреНрдЯ 4 рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде, Apple рдиреЗ рдирдП рдбреЗрдЯрд╛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЯреВрд▓ рдкреЗрд╢ рдХрд┐рдП рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреАрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:

- рдХреЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп
- рд╕рд╛рдВрдХреЗрддрд┐рдХ
- рд╡рд┐рдпреЛрдЬреНрдп

рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ JSON рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рд╕реНрдХ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдирдХреЛрдбреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рд┐рдлреНрдЯ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, Decodable, JSON рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реНрд╡рд┐рдлреНрдЯ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд┐рдЫрд▓реЗ рджреЛ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ рдФрд░ рдЙрдирдХреА рдЯрд╛рдЗрдкреЗрд▓рд┐рдпрд╛рд╕ рд╣реИ:

typealias Codable = Encodable & Decodable 


рдЗрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк, рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

Encodable
рдПрдиреНрдХреЛрдб (to :) - рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЛ рджрд┐рдП рдЧрдП рдПрдирдХреЛрдбрд░ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИ

decodable
init (:) рд╕реЗ - рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдбрд┐рдХреЛрдбрд░ рд╕реЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ

Codable
рдПрдирдХреЛрдб (:)
init (:) рд╕реЗ

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛

рдЕрдм рдХреЛрдбрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдиреНрдХреЛрдбреЗрдмрд▓ рдФрд░ рдбрд┐рдХреЛрдбреЗрдмрд▓ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдк рддреБрд░рдВрдд рд╕рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рд╕рд░рд▓ JSON рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:

 { "title": "Nike shoes", "price": 10.5, "quantity": 1 } 


рдЗрд╕ JSON рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 struct Product: Codable { var title:String var price:Double var quantity:Int enum CodingKeys: String, CodingKey { case title case price case quantity } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(title, forKey: .title) try container.encode(price, forKey: .price) try container.encode(quantity, forKey: .quantity) } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) title = try container.decode(String.self, forKey: .title) price = try container.decode(Double.self, forKey: .price) quantity = try container.decode(Int.self, forKey: .quantity) } } 


рджреЛрдиреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝реАрд▓реНрдб рдХреА рд╕реВрдЪреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓реЗрдЦрди рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдбреЗрдмрд▓ рдПрдирдХреЛрдб рдХреА рдСрдЯреЛ- рдЬрдирд░реЗрд╢рди (рдХреЛ :) рдФрд░ init (:) рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ, рд╕рд╛рде рд╣реА рдЖрд╡рд╢реНрдпрдХ рдЧрдгрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрд░рдЪрдирд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ:

 struct Product: Codable { var title:String var price:Double var quantity:Int } 


рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рдФрд░ рдиреНрдпреВрдирддрд░ред рдХреЗрд╡рд▓, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдРрд╕реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА рдпрджрд┐:

- рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЙрд╕ рдПрдХ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдПрдирдХреЛрдб / рдбрд┐рдХреЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

- рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдгреЛрдВ рдХреЛ рдПрдиреНрдХреЛрдб / рдбрд┐рдХреЛрдб рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ

- рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рдХреБрдЫ рдЧреБрдг рдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ / рд╕реЗ рдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА

- рдпрджрд┐ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдореЗрдВ рдЪрд░ рдирд╛рдо рдФрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдирд╛рдо рдЖрдкрд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ

рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреА рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рд╕рд╛рд░реНрдердХ рд╣реИ:

рддреЛ, рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдЖрдк JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 let product: Product = try! JSONDecoder().decode(Product.self, for: data) 


рдФрд░ рдирд┐рдореНрди рдХреЛрдб, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╕реЗ рдПрдХ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛:
 let productObject = Product(title: "Cheese", price: 10.5, quantity: 1) let encodedData = try? JSONEncoder().encode(productObject) 


рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рддреЗрдЬрд╝ рд╣реИред рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж , рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдЪрдореБрдЪ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ / рдбрд┐рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдордиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдХреЗ рдЫреЛрдЯреЗ рдХреНрд╖реЗрддреНрд░ рд╢рд╛рдорд┐рд▓ рдереЗред рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░ рдХреЛрдбреЗрдмрд▓ рдирд╣реАрдВ рд╣реИрдВред

рдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП , рдореЙрдбрд▓ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЗрдВрдЯ, рдбрдмрд▓, рдбреЗрдЯрд╛, URL ред рдХреЛрдбреЗрдмрд▓ рднреА рдРрд░реЗ, рдбрд┐рдХреНрд╢рдирд░реА, рдСрдкреНрд╢рдирд▓ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрднреА рдЬрдм рдЙрдирдореЗрдВ рдХреЛрдбреЗрдмрд▓ рдЯрд╛рдЗрдкреНрд╕ рд╣реЛрдВред рдпрджрд┐ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рдХреБрдЫ рдЧреБрдг рдХреЛрдбреЗрдмрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕реЗ рд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 struct Pet: Codable { var name: String var age: Int var type: PetType enum CodingKeys: String, CodingKey { case name case age case type } init(from decoder: Decoder) throws { . . . } func encode(to encoder: Encoder) throws { . . . } } 


рдпрджрд┐ рд╣рдорд╛рд░реЗ рдХреЛрдбреЗрдмрд▓ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдореЗрдВ рд╣рдо рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдкреЗрдЯрдЯрд╛рдЗрдк , рдФрд░ рдЗрд╕реЗ рдПрдиреНрдХреЛрдб / рдбрд┐рдХреЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЗрдирд┐рдЯ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдПрдирдХреЛрдб рднреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдбреЗрдЯрд╛ рдореЙрдбрд▓ JSON рдлрд╝реАрд▓реНрдбреНрд╕ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ

рдпрджрд┐ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдореЗрдВ 3 рдлрд╝реАрд▓реНрдб рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ, рдФрд░ 5 рдлрд╝реАрд▓реНрдб JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ 2 рдЕрддрд┐рд░рд┐рдХреНрдд 3 рд╣реИрдВ, рддреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛, рдЖрдкрдХреЛ рдмрд╕ рдЕрдкрдиреЗ 3 рдлрд╝реАрд▓реНрдб рдЙрди 5 рдореЗрдВ рд╕реЗ рдорд┐рд▓реЗрдВрдЧреЗред рдпрджрд┐ рд╡рд┐рдкрд░реАрдд рд╣реЛрддрд╛ рд╣реИ рд╕реНрдерд┐рддрд┐ рдФрд░ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реЛрдЧрд╛, рд░рди-рдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред
рдпрджрд┐ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рд╡реИрдХрд▓реНрдкрд┐рдХ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

 class Product: Codable { var id: Int var productTypeId: Int? var art: String var title: String var description: String var price: Double var currencyId: Int? var brandId: Int var brand: Brand? } 


рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ JSON рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЕрдХреНрд╕рд░ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЖрдк рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреБрдХрд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдлреЙрд░реНрдо рдореЗрдВ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

 { "items": [ { "id": 1, "title": " ", "link": "https://www.youtube.com/watch?v=Myp6rSeCMUw", "created_at": 1497868174, "previewImage": "http://img.youtube.com/vi/Myp6rSeCMUw/mqdefault.jpg" }, { "id": 2, "title": "  2", "link": "https://www.youtube.com/watch?v=wsCEuNJmvd8", "created_at": 1525952040, "previewImage": "http://img.youtube.com/vi/wsCEuNJmvd8/mqdefault.jpg" } ] } 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рджреБрдХрд╛рди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦ рдФрд░ рдбрд┐рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 struct ShopListResponse: Decodable { enum CodingKeys: String, CodingKey { case items } let items: [Shop] } 


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди init рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдбреАрдХреЛрдб рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 self.items = try container.decode([Shop].self, forKey: .items) 


рд╢реЙрдк рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреНрд░рдорд╢рдГ рдбрд┐рдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред

 struct Shop: Decodable { var id: Int? var title: String? var address: String? var shortAddress: String? var createdAt: Date? enum CodingKeys: String, CodingKey { case id case title case address case shortAddress = "short_address" case createdAt = "created_at" } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.id = try? container.decode(Int.self, forKey: .id) self.title = try? container.decode(String.self, forKey: .title) self.address = try? container.decode(String.self, forKey: .address) self.shortAddress = try? container.decode(String.self, forKey: .shortAddress) self.createdAt = try? container.decode(Date.self, forKey: .createdAt) } } 


рддрддреНрд╡реЛрдВ рдХреА рдЗрд╕ рд╕рд░рдгреА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

 let parsedResult: ShopListResponse = try? JSONDecoder().decode(ShopListResponse.self, from: data) 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рджрд┐рдирд╛рдВрдХ рдкреНрд░рд╛рд░реВрдк

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдФрд░ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИ, рдпрд╣рд╛рдВ рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рддрд┐рдерд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рджрд┐рдирд╛рдВрдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдореБрджреНрджрд╛ рдмреИрдХрдПрдВрдб рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╛рд░реВрдк рд╣реИ .deferToDate :

 struct MyDate : Encodable { let date: Date } let myDate = MyDate(date: Date()) try! encoder.encode(foo) 


myDate рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 { "date" : 519751611.12542897 } 


рдпрджрд┐ рд╣рдореЗрдВ, .iso8601 рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ dateEncodingStrategy рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

 encoder.dateEncodingStrategy = .iso8601 


рдЕрдм рддрд╛рд░реАрдЦ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

 { "date" : "2017-06-21T15:29:32Z" } 

рдЖрдк рдирд┐рдореНрди рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╕реНрдЯрдо рддрд┐рдерд┐ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рддрд┐рдерд┐ рдбрд┐рдХреЛрдбрд░ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

.formatted (DateFormatter) - рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рджрд┐рдирд╛рдВрдХ рд╡рд┐рдХреЛрдбрдХ рдкреНрд░рд╛рд░реВрдк рд╣реИ
.custom ((рджрд┐рдирд╛рдВрдХ, рдПрдирдХреЛрдбрд░) рдлреЗрдВрдХрддрд╛ рд╣реИ -> рд╢реВрдиреНрдп) - рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рддрд┐рдерд┐ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк рдмрдирд╛рдПрдВ

рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕

рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рдВрдЪ рдХреА рд╣реИ рдХрд┐ рдЖрдк рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдПрдХ рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ JSON рдлрд╝реАрд▓реНрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧреА рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд JSON рд╣реИ:

 { "id": 349, "art": "M0470500", "title": "- Vichy 50 ", "ratings": { "average_rating": 4.1034, "votes_count": 29 } } 


рд╣рдореЗрдВ "рдФрд╕рдд" рдФрд░ "рд╡реЛрдЯ_рдХрд╛рдЙрдВрдЯ" рдлрд╝реАрд▓реНрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рддреЛ рджреЛ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд░реЗрдЯрд┐рдВрдЧ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдПрдВ, рдпрд╛ рдЖрдк рдиреЗрд╕реНрдЯреЗрдбреЛрдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:

 class Product: Decodable { var id: Int var art: String? var title: String? var votesCount: Int var averageRating: Double enum CodingKeys: String, CodingKey { case id case art case title case ratings } enum RatingsCodingKeys: String, CodingKey { case votesCount = "votes_count" case averageRating = "average_rating" } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.id = try container.decode(Int.self, forKey: .id) self.art = try? container.decode(String.self, forKey: .art) self.title = try? container.decode(String.self, forKey: .title) // Nested ratings let ratingsContainer = try container.nestedContainer(keyedBy: RatingsCodingKeys.self, forKey: .ratings) self.votesCount = try ratingsContainer.decode(Int.self, forKey: .votesCount) self.averageRating = try ratingsContainer.decode(Double.self, forKey: .averageRating) } } 


рдпрд╣реА рд╣реИ, рдиреЗрд╕реНрдЯрдХрдВрдЯреЗрдирдЯрд░ рдФрд░ рдЗрд╕рдХреЗ рдЖрдЧреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдпрджрд┐ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝реАрд▓реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдЗрддрдиреА рдмрдбрд╝реА рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

JSON рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо рдФрд░ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдЧреБрдгреЛрдВ рдХрд╛ рдмреЗрдореЗрд▓

рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдореЗрдВ рдЧрдгрдирд╛рдПрдВ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЧрдгрдирд╛ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдХрднреА-рдХрднреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреА рдЬрд╛рддреА рд╣реИ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 enum RatingsCodingKeys: String, CodingKey { case votesCount = "votes_count" case averageRating = "average_rating" } 


рдпрд╣ рдореЙрдбрд▓ рдЪрд░ рдФрд░ JSON рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдирд╛рдо рдореЗрдВ рдХрдИ рд╢рдмреНрдж рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ JSON рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЧрдгрдирд╛ рдХрд╛ рдРрд╕рд╛ рдкреБрди: рдирд┐рд░реНрдзрд╛рд░рдг рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ рдФрд░ рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдкреНрдкрд▓ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдпрд╛ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ keyDecodingStrategy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд▓рд╛рдЗрди рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдлреАрдЪрд░ рд╕реНрд╡рд┐рдлреНрдЯ 4.1 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдлреЙрд░реНрдо рдХрд╛ JSON рд╣реИ:

 let jsonString = """ [ { "name": "MacBook Pro", "screen_size": 15, "cpu_count": 4 }, { "name": "iMac Pro", "screen_size": 27, "cpu_count": 18 } ] """ let jsonData = Data(jsonString.utf8) 


рдЪрд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд╛рдЯрд╛ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ:

 struct Mac: Codable { var name: String var screenSize: Int var cpuCount: Int } 

рдореЙрдбрд▓ рдореЗрдВ рдЪрд░ рдХреЛ рд╕рдордЭреМрддреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд▓реЛрдЕрд░рдХреЗрд╕ рдЕрдХреНрд╖рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдПрдХ рдХреИрдкрд┐рдЯрд▓ рд▓реЗрдЯрд░ (рддрдерд╛рдХрдерд┐рдд рдКрдВрдЯ ) рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди JSON рдореЗрдВ, рдлрд╝реАрд▓реНрдб рдЕрдВрдбрд░рд╕реНрдХреЛрд░ (рддрдерд╛рдХрдерд┐рдд рд╕реНрдиреЗрдХ_рдХреЗрд╕ ) рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдЕрдм, рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╛ рддреЛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдЧрдгрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо JSON рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ рдЪрд░ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдпрд╛ рд╣рдореЗрдВ рдПрдХ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред рд▓реЗрдХрд┐рди рдЕрдм рдХреЗрд╡рд▓ рдХреАрдбреЗрдХреЛрдбрд┐рдВрдЧрд╕реНрдЯреНрд░реЗрдЧреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ

 let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase do { let macs = try decoder.decode([Mac].self, from: jsonData) } catch { print(error.localizedDescription) } 


рдПрдирдХреЛрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдк рддрджрдиреБрд╕рд╛рд░ рдЙрд▓рдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 encoder.keyEncodingStrategy = .convertToSnakeCase 


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреАрдбреЗрдХреЛрдбрд┐рдВрдЧрд╕реНрдЯреНрд░реЗрдЧреА рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ:

 let jsonDecoder = JSONDecoder() jsonDecoder.keyDecodingStrategy = .custom { keys -> CodingKey in let key = keys.last!.stringValue.split(separator: "-").joined() return PersonKey(stringValue: String(key))! } 


рдпрд╣ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSON рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрдХ "-" рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП JSON рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 { "first-Name": "Taylor", "last-Name": "Swift", "age": 28 } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдЧрдгрдирд╛ рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрдХреНрд╕рд░ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐

рдЬрдм JSON рдХреЛ рдкрд╛рд░реНрд╕ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдкреНрд░рд╛рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдЖрдЗрдП рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рдВрднрд╡ рд╣реИрдВ:

  • DecodingError.dataCorrupted (DecodingError.Context) - рдбреЗрдЯрд╛ рджреВрд╖рд┐рдд рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рдбреЗрдЯрд╛ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкреЗрдХреНрд╖рд┐рдд JSON рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдкреНрд░рд╛рд░реВрдк рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред
  • DecodingError.keyNotFound (CodingKey, DecodingError.Context) - рдЕрдиреБрд░реЛрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЖрдкрдХреЛ рдЙрдореНрдореАрдж рдереА рд╡рд╣ рдЧрд╛рдпрдм рд╣реИ
  • DecodingError.typeMismatch (Any.Type, DecodingError.Context) - рдЯрд╛рдЗрдк рдмреЗрдореЗрд▓ред рдЬрдм рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ
  • DecodingError.valueNotFound (Any.Type, DecodingError.Context) - рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд▓рд╛рдкрддрд╛ рдорд╛рдиред рдЬрд┐рд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рдЖрдкрдиреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдореЗрдВ рдпрд╣ рдлрд╝реАрд▓реНрдб рд╢реВрдиреНрдп рд╣реИред рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЗрд╡рд▓ рдЧреИрд░-рд╡реИрдХрд▓реНрдкрд┐рдХ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИ, рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХреЛрдИ рдорд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред


рдЬрдм рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдбреЗрдЯрд╛, рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрднрд╡ рд╣реИ:

EncodingError.invalidValue (Any.Type, DecodingError.Context) - рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ред

JSON рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

  do { let decoder = JSONDecoder() _ = try decoder.decode(businessReviewResponse.self, from: data) } catch DecodingError.dataCorrupted(let context) { print(DecodingError.dataCorrupted(context)) } catch DecodingError.keyNotFound(let key, let context) { print(DecodingError.keyNotFound(key,context)) } catch DecodingError.typeMismatch(let type, let context) { print(DecodingError.typeMismatch(type,context)) } catch DecodingError.valueNotFound(let value, let context) { print(DecodingError.valueNotFound(value,context)) } catch let error{ print(error) } 


рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ, рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдЙрддреНрдкрд╛рдж" рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорд╛рди рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

рдЫрд╡рд┐

рдХреЛрдбреЗрдмрд▓ рдФрд░ рдПрдирдПрд╕ рдХреЛрдбрд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛

рдмреЗрд╢рдХ, рдХреЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдбреЗрдЯрд╛ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдХрджрдо рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ NSCoding рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореМрдЬреВрдж рдереЗред рдЖрдЗрдП рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреЛрдбреЗрдмрд▓ рдХреЗ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИрдВ:

  • NSCoding рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп , рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ NSObject рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдПрдХ рд╡рд░реНрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдбреЗрдмрд▓ рдореЗрдВ , рдХреНрд░рдорд╢рдГ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрд░рдорд╢рдГ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╡рд░реНрдЧ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдПрдирдо рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдпрджрд┐ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд JSON рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдХреЗрд╡рд▓ рдПрдХ Decodable рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдХрднреА-рдХрднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ init рдпрд╛ рд╕рд╛рдВрдХреЗрддрд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • рдХреЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ init рдФрд░ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рд╡рд┐рдзрд┐рдпреЛрдВ, рд╕рд╛рде рд╣реА рд╡реИрдХрд▓реНрдкрд┐рдХ CodingKeys рдЧрдгрди рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рд░рд▓ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдВ, рдЕрдиреНрдпрдерд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк keyDecodingStrategy рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдХреБрдЫ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛрдб рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред


рдХреЛрдбреЗрдмрд▓, рдбрд┐рдХреЛрдбреЗрдмрд▓ рдФрд░ рдПрдирдХреЛрдбреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдиреЗ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдФрд░ рдХрджрдо рдЙрдард╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА, рдирдП, рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреВрд▓ рджрд┐рдЦрд╛рдИ рджрд┐рдП, рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХрдо рд╣реЛ рдЧрдИ, рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реЛ рдЧрдпрд╛ред рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдлреНрдЯ 4 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдкреНрд░рдпреЛрдЬреНрдп рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯрдЬрд╕рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреЗ рд╣реИрдВред рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рднреА рдбреЗрдЯрд╛ рдореЙрдбреНрдпреВрд▓ рдФрд░ рддрд░реАрдХреЛрдВ рдХреЛ рдЙрдирдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХрд░рдХреЗ рдХреЛрдб рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдареАрдХ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi414221/


All Articles