рд╕реНрд╡рд┐рдлреНрдЯ: рдкреНрд░рдореБрдЦ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЪрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░


рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ UserDefaults рдореЗрдВ рдпреВрдЬрд░ рдЖрдИрдбреА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдХрджрдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛?


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


  • рд▓реЗрдЦрди рдХреБрдВрдЬреА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ : рдПрдХ рд╣реА рдЗрдХрд╛рдИ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдЙрдк-рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдп : рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕реА рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдЖрдк рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
  • рдореБрдЦреНрдп рдЯрдХреНрдХрд░ : рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдПрдХ рд╣реА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдХрд╛рдЗрдпрд╛рдВ рджрд░реНрдЬ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред

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


рднрдВрдбрд╛рд░рдг рдкреНрд░реЛрдЯреЛрдХреЙрд▓


рддреЛ, рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдЬреЛ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ UserDefaults , рдФрд░ рдПрдХ рдЪрд╛рдмреА рдХрд╛ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдХреБрдВрдЬреА-рдореВрд▓реНрдп рд╕рдВрдЧреНрд░рд╣рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдЧрд╛ред рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрд╣реБрдд рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ:


 protocol KeyValueStorage { func value<T: Codable>(forKey key: String) -> T? func setValue<T: Codable>(_ value: T?, forKey key: String) } 

рддреЛ рдХреЛрдИ рднреА рд╕реНрдЯреЛрд░реЗрдЬ рдЬреЛ рдХрд┐ KeyValueStorage рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рдЙрд╕реЗ рджреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдВрдЬреА рдорд╛рдиреЛрдВ рдХрд╛ рдЧреЗрдЯрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ред рдЙрд╕реА рд╕рдордп, рдорд╛рди рд╕реНрд╡рдпрдВ Codable рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк Codable рд╣реИрдВ, рдЬреЛ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSON рдпрд╛ рдкреНрд░реЙрдкрд░реНрдЯреАрд▓рд┐рд╕реНрдЯ )ред


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


рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


KeyValueStorage рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:


  • рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рддрд╣рдд рдореМрдЬреВрджрд╛ рднрдВрдбрд╛рд░рдг рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реЗрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВ:

 extension UserDefaults: KeyValueStorage { func value<T: Codable>(forKey key: String) -> T? { //   } func setValue<T: Codable>(_ value: T?, forKey key: String) { //   } } 

  • рднрдВрдбрд╛рд░рдг рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ, рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЦреЗрддреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдПрдВ:

 class PersistentStorage: KeyValueStorage { private let userDefaults: UserDefaults let suiteName: String? let keyPrefix: String init?(suiteName: String? = nil, keyPrefix: String = "") { guard let userDefaults = UserDefaults(suiteName: suiteName) else { return nil } self.userDefaults = userDefaults self.suiteName = suiteName self.keyPrefix = keyPrefix } func value<T: Codable>(forKey key: String) -> T? { //   } func setValue<T: Codable>(_ value: T?, forKey key: String) { //   } } 

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


рддрд░реАрдХреЛрдВ рдХреЗ value(forKey:) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП value(forKey:) рдФрд░ setValue(:forKey:) рдбреЗрдЯрд╛ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдорд╛рдирдХ UserDefaults рдЙрдкрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди KeyValueStorage , рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВред


рд░реЗрдбреА-рдЯреВ- PersistentStorage рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред


рдореВрд▓реНрдп рдХрдВрдЯреЗрдирд░


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


 class KeyValueContainer<T: Codable> { let storage: KeyValueStorage let key: String var value: T? { get { storage.value(forKey: key) } set { storage.setValue(newValue, forKey: key) } } init(storage: KeyValueStorage, key: String) { self.storage = storage self.key = key } } 

рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдЙрд╕реА рддрд░рд╣ Codable рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдЯреЛрд░ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╣реА рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдмрд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреБрдВрдЬреА рдФрд░ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддреА рд╣реИред


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


рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 class KeyValueContainer<T: Codable> { let storage: KeyValueStorage let key: String let defaultValue: T? var value: T? { get { storage.value(forKey: key) ?? defaultValue } set { storage.setValue(newValue, forKey: key) } } init(storage: KeyValueStorage, key: String, defaultValue: T? = nil) { self.storage = storage self.key = key self.defaultValue = defaultValue } } 

рдХрдВрдЯреЗрдирд░ рд╣рдорд╛рд░реА рдкрд╣рд▓реА рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рддреЛ рдПрдХ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рднреА рдкреНрд░рдпрд╛рд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдЬ рдкрд░ рд░реЛрдХрд╛ рдЬрд╛рдПрдЧрд╛:


 func doSomething(with container: KeyValueContainer<Int>) { container.value = "Text" //   } 

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


рдореБрдЦреНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛


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


 extension KeyValueStorage { func makeContainer<T: Codable>(key: String = #function) -> KeyValueContainer<T> { KeyValueContainer(storage: self, key: key) } } 

рддреЛ рднрдВрдбрд╛рд░рдг рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реА рдЬрд╛рдПрдЧреА рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рд▓реМрдЯрд╛рддреА рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ key рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ #function ( рдкреНрд░рд▓реЗрдЦрди ) рдХреЗ рдмрд░рд╛рдмрд░ рдореВрд▓реНрдп рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдЬ рдкрд░, #function рд╢рд╛рдмреНрджрд┐рдХ #function рдШреЛрд╖рдгрд╛ рдХреЗ рдирд╛рдо рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ makeContainer(key:) рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред


рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдЖрдкрдХреЛ рднрдВрдбрд╛рд░рдг рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдирд╛рдо рдкрд░рд┐рдХрд▓рд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рдирд╛рдо рд╣реЛрдВрдЧреЗ рдпрджрд┐ makeContainer() рд╡рд┐рдзрд┐ рдХреЛ рдЙрдирдореЗрдВ key рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:


 extension PersistentStorage { var foobar: KeyValueContainer<Int> { makeContainer() } } 

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, PersistentStorage рд╕рдВрдЧреНрд░рд╣рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдирд╛рдо рдХреЗ foobar рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде foobar рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реЛрдЧрд╛ред рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ foobar рдХрдВрдЯреЗрдирд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рдПрдЧреА, рдЬреЛ рд╣рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреА рд╣реИред



рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛


рдореВрд▓реНрдп рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рднреА рд╕реНрдЯреЛрд░реЗрдЬ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ UserDefaults рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдЗрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде KeyValueStorage рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рддрд╣рдд рдХрд┐рд╕реА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореВрд▓реНрдп рдХреЗ рднрдВрдбрд╛рд░рдг (рд╣рд╕реНрддрд╛рдХреНрд╖рд░) рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реБрд░рдХреНрд╖рд┐рдд рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдРрд╕реЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдбрд┐рдЬрд╝рд╛рдЗрдиреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИ:


 extension PersistentStorage { //   var foobar: KeyValueContainer<Int> { makeContainer() } } //   let foobar = storageInstance.foobar.value //   storageInstance.foobar.value = 123 

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


рд╡рд╣ рд╕рдм рд╣реИред рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред рдЕрд▓рд╡рд┐рджрд╛!

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


All Articles