UIKit рдФрд░ UIKit рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ MVVMs рдХреЛ рдорд┐рд▓рд╛рдПрдВ



рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ ObservableObjecрдЗрд╕рдХреЗ рд╕рд╛рде рдЯреА рдХрдХреНрд╖рд╛рдПрдВ @PublishedрдЧреБрдг рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ CombineрдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк View ModelрдореЗрдВ SwiftUIред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ View ModelрдХреЗ UIKitрдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди  рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ MVVM, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рдПрд▓ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ "рдмрд╛рдЗрдВрдб" ( bind) рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдЖрдк рдХреБрдЫ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ , рдЖрдк рдмрд╛рдж рдореЗрдВ рджрд░реНрдж рд░рд╣рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВрдЧреЗ ред рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рдЖрджрд┐рдо рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдо рдЙрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВUI@Published View ModeCombineUIKitSwiftUI

MVVMUIKit CombineView Model рд╕реА SwiftUIред

рд▓реЗрдЦ рджреЛ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ OpenWeatherMa p рд╕рд╛рдЗрдЯ рд╕реЗ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рд╣рд░ рдХреЗ рд▓рд┐рдП рдирд╡реАрдирддрдо рдореМрд╕рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ред рд▓реЗрдХрд┐рди UIрдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ SwiftUI, рдФрд░ рджреВрд╕рд░рд╛ рдорджрдж рд╕реЗ UIKitред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдпреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рдЧрднрдЧ рд╕рдорд╛рди рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред



рдХреЛрдб Github рдкрд░ рд╣реИ ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ( UI) рдореЗрдВ рдХреЗрд╡рд▓ 2 UI рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ : рд╢рд╣рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдФрд░ рддрд╛рдкрдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдмрд▓ред рд╢рд╣рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдмреЙрдХреНрд╕ рд╕рдХреНрд░рд┐рдп INPUT ( Input) рд╣реИ, рдФрд░ рддрд╛рдкрдорд╛рди рд▓реЗрдмрд▓ рдирд┐рд╖реНрдХреНрд░рд┐рдп EXIT ( Output) рд╣реИред  

рднреВрдорд┐рдХрд╛ View Model рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ MVVMрд╣реИ рдХрд┐ рдпрд╣ рд╕реЗ рдЗрдирдкреБрдЯ (рд░реЛрдВ) рд▓реЗрддрд╛ рд╣реИ View(рдпрд╛ ViewControllerрдореЗрдВ UIKitрдЖрд╡реЗрджрди рдХреЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ), рдФрдЬрд╛рд░ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рднреЗрдЬрддрд╛  View(рдпрд╛ ViewControllerрдореЗрдВ UIKit), рд╕рдВрднрд╡рддрдГ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдпрд╣ рдбреЗрдЯрд╛ рдкреЗрд╢ред

рдЗрд╕  рдмрд╛рдд View Modelрд╕реЗ CombineрдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ - рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ - рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВ рдпрджрд┐ рдЖрдк ObservableObject рдЗрд╕рдХреЗ @PublishedрдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

API OpenWeatherMap


рд╣рд╛рд▓рд╛рдВрдХрд┐ OpenWeatherMap рд╕реЗрд╡рд╛  рдЖрдкрдХреЛ   рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рдореМрд╕рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕ рдбреЗрдЯрд╛ рдореЗрдВ рд╣рдо рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рдореЙрдбрд▓ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛, рдпрд╣ WeatherDetailрдЪрдпрдирд┐рдд рд╢рд╣рд░ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореМрд╕рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛  рд╣реИ рдФрд░ Model.swift рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ  :



рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рддрд╛рдкрдорд╛рди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦреЗрдВрдЧреЗ temp, рдЬреЛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╣реИ  Main, рдореЙрдбрд▓ рд╡рд░реНрддрдорд╛рди рдореМрд╕рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдПрдХ рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ  WeatherDetail, рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрдк рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдВрд░рдЪрдирд╛ WeatherDetail рдХреЛрдбреЗрдмрд▓ рд╣реИ, рдпрд╣ рд╣рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рд┐рд░реНрдл рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ JSONрд╕рд╛рде рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдЪрдореБрдЪ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛  ред

рд╕рдВрд░рдЪрдирд╛  WeatherDetail рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПIdentifiableрдЕрдЧрд░ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореМрд╕рдо рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА [WeatherDetail] рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЦреБрдж рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ  рд╕реВрдЪреА  List рдХреЗ рд░реВрдк рдореЗрдВ SwiftUIред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рд╡рд░реНрддрдорд╛рди рдореМрд╕рдо рдРрдк рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рд░рд┐рдХреНрдд рд╣реИред рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ Identifiableрд▓рд┐рдП рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ id,рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╕реЗ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЖрдорддреМрд░ рдкрд░, OpenWeatherMap рд╕реЗрд╡рд╛ рд╕рд╣рд┐рдд рд╕реЗрд╡рд╛рдПрдБ,  URLs рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реЗрд╡рд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ ред OpenWeatherMap рд╕реЗрд╡рд╛  рд╣рдореЗрдВ URLsрдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╢рд╣рд░ рдореЗрдВ 5 рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореМрд╕рдо рдпрд╛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреА рд╣реИ cityред рдЗрд╕ рдЖрд╡реЗрджрди рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдореМрд╕рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрдВрдЧреЗURLрдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХреА рдЧрдИ absoluteURL (city: String): OpenWeatherMap



API  рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП,  рд╣рдо рдЗрд╕реЗ WeatherAPI.swift рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦреЗрдВрдЧреЗ ред рдЗрд╕рдХрд╛ рдХреЗрдВрджреНрд░реАрдп рднрд╛рдЧ рдПрдХ рд╢рд╣рд░ рдореЗрдВ  рд╡рд┐рд╕реНрддреГрдд рдореМрд╕рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрдЧреА  :WeatherDetailcity

  • fetchWeather (for city: String) -> AnyPublisher<WeatherDetail, Never>

рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, Combine рдпрд╣ рд╡рд┐рдзрд┐ рди рдХреЗрд╡рд▓ рд╡рд┐рд╕реНрддреГрдд рдореМрд╕рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрддреА рд╣реИ  WeatherDetail, рдмрд▓реНрдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд "рдкреНрд░рдХрд╛рд╢рдХ" рд╣реИ Publisherред рд╣рдорд╛рд░рд╛ "рдкреНрд░рдХрд╛рд╢рдХ" AnyPublisher<WeatherDetail, Never>рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - NeverрдФрд░ рдпрджрд┐ рдХреЛрдИ рдирдореВрдирд╛ рдпрд╛ рдХреЛрдбрд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдЕрднреА рднреА рд╣реБрдИ рд╣реИ, рддреЛ рдбрд┐рдкреНрдЯреА WeatherDetail.placeholderрддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджреЗрд╢ рдХреЗ рдмрд┐рдирд╛ рд▓реМрдЯрддрд╛ рд╣реИ  ред 

рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЙрд╕ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ  fetchWeather (for city: String) -> AnyPublisher<WeatherDetail, Never>рдЬреЛ OpenWeatherMap рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ  рд╢рд╣рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рдореМрд╕рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЪрдпрди рдХрд░рддреА рд╣реИ  cityрдФрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ Never:



  1. рд╢рд╣рд░ рдХреЗ рдирд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо  city рдЧрдпрд╛ рдлрд╝реЙрд░реНрдо URL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ absoluteURL(city:city)рд╡рд┐рд╕реНрддреГрдд рдореМрд╕рдо рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ  WeatherDetail,
  2. ┬л┬╗ dataTaskPublisher(for:), Output (data: Data, response: URLResponse),   Failure - URLError,
  3. map { } (data: Data, response: URLResponse)  data
  4. JSON  data ,  WeatherDetail, ,
  5. - ┬л┬╗  catch (error ... )  ┬л┬╗ WeatherDetail.placeholder,
  6. main , UI,
  7. ┬л┬╗ ┬л┬╗ eraseToAnyPublisher() AnyPublisher.

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ "рдкреНрд░рдХрд╛рд╢рдХ" рдЗрд╕ рдкреНрд░рдХрд╛рд░ AnyPublisher"рдмрдВрдж" рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ, рдпрд╣ рддрдм рддрдХ рдХреБрдЫ рднреА рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдЗрд╕реЗ "рд╕рджрд╕реНрдпрддрд╛" рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдПрдХ рдРрд╕реЗ ObservableObject рд╡рд░реНрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ  View ModelрдЬреЛ SwiftUIрджреЛрдиреЛрдВ рдореЗрдВ  рдПрдХ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ рдФрд░ UIKitред 

рдореЙрдбрд▓ рдмрдирд╛рдПрдВ рджреЗрдЦреЗрдВ


рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП View ModelрдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ  TempViewModelрдХрд┐ рдФрдЬрд╛рд░ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ ObservableObject рджреЛ рдХреЗ рд╕рд╛рде  @Published рдЧреБрдг:  



  1. рдПрдХ  @Published var city: Stringрд╢рд╣рд░ рд╣реИ (рдЖрдк рдЗрд╕реЗ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ View),  
  2. рджреВрд╕рд░рд╛  @Published var currentWeather = WeatherDetail.placeholder рдЗрд╕ рд╕рдордп рдЗрд╕ рд╢рд╣рд░ рдореЗрдВ рдореМрд╕рдо рд╣реИ (рд╣рдо рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ EXIT рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ OpenWeatherMap рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ  )ред

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдПрдХ @Published рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд  cityрдХрд░ рд▓реЗрддреЗ рд╣реИрдВ  , рддреЛ рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдкрддреНрддрд┐ рдХреЗ cityрд░реВрдк рдореЗрдВ рдФрд░ "рдкреНрд░рдХрд╛рд╢рдХ"  рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ  $cityред

рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ  TempViewModel, рдЖрдк рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣рд┐рдд рдХреЗ рдЧреБрдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрдирдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ TempViewModel , init?рддреЛ рд╣рдо рдПрдХ "рд╕рджрд╕реНрдпрддрд╛" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрдХреНрд╖рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ  рдкреВрд░реЗ "рдЬреАрд╡рди рдЪрдХреНрд░" рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧреА TempViewModelрдФрд░ currentWeather рд╢рд╣рд░ рдкрд░  рд╡рд░реНрддрдорд╛рди рдореМрд╕рдо рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди  рдХрд░реЗрдЧреА  cityред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Combineрд╣рдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдЗрдирдкреБрдЯ "рдкреНрд░рдХрд╛рд╢рдХ" $city рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ "рдкреНрд░рдХрд╛рд╢рдХ" AnyPublisher<WeatherDetail, Never>рддрдХ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рд╡рд░реНрддрдорд╛рди рдореМрд╕рдо рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░" рдХреА рдорджрдж рд╕реЗ рдЗрд╕реЗ "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм" рдХрд░рддреЗ рд╣реИрдВ assign (to: \.currentWeather, on: self) рдФрд░ рд╡рд░реНрддрдорд╛рди рдореМрд╕рдо рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди  currentWeather "рдЖрдЙрдЯрдкреБрдЯ"  @Published рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рд╣рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдЧреБрдгреЛрдВ рд╕реЗ рдирд╣реАрдВ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП city, рдЕрд░реНрдерд╛рддреН "рдкреНрд░рдХрд╛рд╢рдХреЛрдВ" рд╕реЗ $cityрдЬреЛ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВрдЧреЗ UI рдФрд░ рдпрд╣ рд╡рд╣рд╛рдВ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВрдЧреЗред

рд╣рдо рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ?

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди fetchWeather (for city: String)рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣реИ  WeatherAPIрдФрд░ AnyPublisher<WeatherDetail, Never> рд╢рд╣рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдореМрд╕рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде "рдкреНрд░рдХрд╛рд╢рдХ" рд▓реМрдЯрд╛рддрд╛ рд╣реИ  city, рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рдХрд┐рд╕реА рднреА "рдкреНрд░рдХрд╛рд╢рдХ" рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ  $cityрдЗрд╕реЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдСрдкрд░реЗрдЯрд░ рдХреА рдорджрдж 

 рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдкреНрд░рдХрд╛рд╢рдХ fetchWeather (for city: String) рдкрд░  рдЬрд╛рдПрдВ  : рдСрдкрд░реЗрдЯрд░CombineflatMap



flatMapрдкрд┐рдЫрд▓реЗ "рдкреНрд░рдХрд╛рд╢рдХ" рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдпрд╛ "рдкреНрд░рдХрд╛рд╢рдХ" рдмрдирд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░" рдХреА рдорджрдж рд╕реЗ рдЗрд╕ рдирдП "рдкрдмреНрд▓рд┐рд╢рд░" рдХреЛ "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм" рдХрд░рддреЗ рд╣реИрдВ  assign (to: \.currentWeather, on: self)рдФрд░ @PublishedрдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ "рдкрдмреНрд▓рд┐рд╢рд░" рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡реИрд▓реНрдпреВ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ  currentWeather:



рд╣рдордиреЗ рд╕рд┐рд░реНрдл рдПрдХ init( )ASYNCHRONOUS "рдкрдмреНрд▓рд┐рд╢рд░" рдФрд░ "рд╕рдмреНрд╕реНрдХреНрд░рд╛рдЗрдмреНрдб" рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк AnyCancellable"рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди" рдорд┐рд▓рд╛ред "ред

AnyCancellable "рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди" рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ "рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди" рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЕрдм "рдкреНрд░рдХрд╛рд╢рдХ" рд╕реЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреИрд╕реЗ рд╣реА  AnyCancellable"рд╕рджрд╕реНрдпрддрд╛" рдЕрдкрдирд╛ рджрд╛рдпрд░рд╛ рдЫреЛрдбрд╝рддреА рд╣реИ, "рдкреНрд░рдХрд╛рд╢рдХ" рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕реЗ рд╣реА рдпрд╣ init( ) рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ "рд╕рджрд╕реНрдпрддрд╛" рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ARC, рдФрд░ рд╕рдордп рдХреА рджреЗрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрддрдорд╛рди рдореМрд╕рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ  currentWeatherред рдЗрд╕ рддрд░рд╣ рдХреЗ "рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди" рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ OUTSIDE init()рд╡реИрд░рд┐рдПрдмрд▓ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдЗрд╕ "рд╡реИрд░рд┐рдПрдмрд▓" рдХреЛ рдХреНрд▓рд╛рд╕ рдХреЗ рдкреВрд░реЗ "рд▓рд╛рдЗрдл рд╕рд╛рдЗрдХрд▓" рдореЗрдВ рдЗрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ  var cancellableSetрд░рдЦреЗрдЧрд╛ ред  "рд╕рджрд╕реНрдпрддрд╛" рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ  : рдирддреАрдЬрддрди, "рд╕рджрд╕реНрдпрддрд╛" рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреВрд░реЗ "рдЬреАрд╡рди рдЪрдХреНрд░" рднрд░ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛  ред рд╣рдо рдкреНрд░рдХрд╛рд╢рдХ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ , рдФрд░  рдЗрд╕ рд╢рд╣рд░ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдореМрд╕рдо рд╣рдореЗрд╢рд╛ рд╣рдорд╛рд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рд░рд╣реЗрдЧрд╛ ред рд╢рд╣рд░ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╕рдордп рд╕рд░реНрд╡рд░ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП AnyCancellableTempViewMode

AnyCancellablecancellableSetstore ( in: &self.cancellableSet)



TempViewModel$citycurrentWeather

city, рд╣рдореЗрдВ рд╢рд╣рд░ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреЗ "рдкреНрд░рдХрд╛рд╢рдХ" рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП  $city, рд▓реЗрдХрд┐рди рдСрдкрд░реЗрдЯрд░реЛрдВ debounceрдФрд░ removeDuplicates: рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг



ред рдСрдкрд░реЗрдЯрд░ рдХреЛ  debounce рдХреАрдмреЛрд░реНрдб рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдЯрд╛рдЗрдк рдХрд░рдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рдирддрд╛ рдПрдХ рдмрд╛рд░ рдХрд░реЗрдВред

рдЗрд╕реА рддрд░рд╣, рдПрдХ рдСрдкрд░реЗрдЯрд░ removeDuplicatesрдореВрд▓реНрдпреЛрдВ рдХреЛ рддрднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдЬрдм рд╡реЗ рдХрд┐рд╕реА рднреА рдкрд┐рдЫрд▓реЗ рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ john, рддреЛ joe, рдФрд░ рдлрд┐рд░ john, рд╣рдо johnрдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ ред рдпрд╣ рд╣рдорд╛рд░реЗ UIрдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ ред

SwiftUI рдХреЗ рд╕рд╛рде UI рдмрдирд╛рдирд╛


рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ View Model, рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ UIред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ SwiftUI, рдФрд░ рдлрд┐рд░ рдкрд░ UIKitред

рд╣рдо XcodeрдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ SwiftUIрдФрд░ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╣рдо рдПрдХ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛ ContentView  рд╕реНрдерд╛рди рд░рдЦрддреЗ рд╣реИрдВ  ред рд╢реАрд░реНрд╖рдХ рдХреЗ рд╕рд╛рде  рдмрджрд▓реЗрдВ  , рд╢рд╣рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рда рдмреЙрдХреНрд╕ рдЬреЛрдбрд╝реЗрдВ  рдФрд░ рддрд╛рдкрдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдмрд▓: рд╣рдордиреЗ рд╕реАрдзреЗ рдЕрдкрдиреЗ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ ред рд╣рдордиреЗ рд╢рд╣рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдмреЙрдХреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ , рдФрд░ рддрд╛рдкрдорд╛рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рдореЗрдВ - ред рдЕрдм,  рдЧреБрдгреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ  "рдкреБрдирд░реНрд╡рд┐рддрд░рдг" рд╣реЛрдЧрд╛ : рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╣реИView Model @ObservedObject modelText ("Hello, World!") Text ("WeatherApp")TextField ("City", text: self.$model.city) 



model: TempViewModel()$model.citymodel.currentWeather.main?.temp

@PublishedView



View Model @ObservedObject, рдпрд╣ рд╣реИ рдХрд┐, рд╣рдорд╛рд░реЗ рдЧреБрдгреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ ( ) рдХреЗ "рдмрд╛рдзреНрдпрдХрд╛рд░реА" ( binding) @PublishedрдХреЛ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдРрд╕рд╛ рд╕реНрд╡рдд: "рдмрд╛рдзреНрдпрдХрд╛рд░реА" рдХреЗрд╡рд▓ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ редView ModelUISwiftUI

UIKit рд╡рд╛рд▓рд╛ UI рдмрдирд╛рдирд╛


рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ UIKit? рдпрд╣ рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд╣реИ  @ObservedObjectред рдореЗрдВ  UIKit рд╣рдо "рдмрд╛рдЗрдВрдбрд┐рдВрдЧ" рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗ ( bindingрдореИрдиреНрдпреБрдЕрд▓)ред рдЗрд╕ "рдореИрдиреБрдЕрд▓ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ" рдХреЛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:

  • Key-Value Observing рдпрд╛ KVO: рдХрд┐рд╕реА key pathsрд╕рдВрдкрддреНрддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдФрд░ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░  рдЬреЛ рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред
  • рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдпрд╛ FRP: рдПрдХ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ Combineред
  • Delegation: рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдп рдмрджрд▓ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
  • Boxing: didSet { } , .

рд▓реЗрдЦ рдХреЗ рд╢реАрд░реНрд╖рдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ Combineред рдореЗрдВ UIKitрдЖрд╡реЗрджрди, рд╣рдо рджрд┐рдЦрд╛ рджреЗрдВрдЧреЗ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХреЗ рд╕рд╛рде рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рдореИрдиреНрдпреБрдЕрд▓ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ" рд╣реИ Combineред

рдореЗрдВ UIKitрдЖрд╡реЗрджрди, рд╣рдо рднреА рджреЛ рд╣реЛрдЧрд╛ UI : рддрддреНрд╡реЛрдВ UITextFieldрд╢рд╣рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ UILabelрддрд╛рдкрдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдореЗрдВ ViewControllerрд╣рдо рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╣реЛрдЧрд╛ OutletрдЗрди рддрддреНрд╡реЛрдВ:





рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ viewModel, рд╣рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдПрдХ рд╣реИ View Modelрдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ:



рдХрд░ "рдореИрдиреБрдЕрд▓ рдмрдВрдзрди" рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ Combine, рдЪрд▓реЛ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ UITextFieldрд╣рдорд╛рд░реЗ рд╕рд╣рдпреЛрдЧреА рдФрд░ рд╣рдорд╛рд░реЗ рд╕рд╛рдордЧреНрд░реА рдХреА "рдкреНрд░рдХрд╛рд╢рдХ" text:



рдпрд╣ рд╣рдореЗрдВ viewDidLoadрдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдореИрдиреБрдЕрд▓ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ" рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛binding ():



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо "рдкреНрд░рдХрд╛рд╢рдХ" рдХреА cityTextField.textPublisher"рд╕рджрд╕реНрдпрддрд╛" рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ "рдЧреНрд░рд╛рд╣рдХ" рдХреА рдорджрдж рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ  assign (to: \.city, on: viewModel)рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкрд╛рда cityTextFieldрдХреЛ рд╣рдорд╛рд░реА "рдЗрдирдкреБрдЯ" @Publishedрд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ "рдЗрдирдкреБрдЯ"  рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ cityрд╣реИрдВ View Modelред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдПрдХ рдФрд░ рджрд┐рд╢рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░" рдХреА  @Publishedрд╕рдВрдкрддреНрддрд┐  $currentWeather рдХреЛ "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░" sink рдФрд░ рдЙрд╕рдХреЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреА рдорджрдж рд╕реЗ "рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм" receiveValueрдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдкрдорд╛рди рдорд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд▓реЗрдмрд▓ рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ temperatureLabelред "рд╕рджрд╕реНрдпрддрд╛"

рдореЗрдВ рдкреНрд░рд╛рдкреНрдд  viewDidLoad рдПрдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ var cancellableSetред рдЙрдиреНрд╣реЗрдВ рдПрдХ рдмрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреВрд░реЗ "рдЬреАрд╡рди рдЪрдХреНрд░" рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ ViewControllerрдФрд░ рд╕рд╛рде рдореЗрдВ рд╣рдорд╛рд░реЗ "рд╕рджрд╕реНрдпрддрд╛" рдХреЗ рд╕рд╛рде View ModelрдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рд╡реИрд╕реЗ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ ObservableObjectрд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ UIKit, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред UIKit рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреНрд░рддрд┐ рдЙрджрд╛рд╕реАрди ObservableObjectрдФрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ View ModelрдореЗрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ  UIKit :



рд▓реЗрдХрд┐рди рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ View ModelрдЪрд╛рд▓реВ рдЕрдиреБрдкреНрд░рдпреЛрдЧ UIKitрдФрд░ рд╕рдВрднрд╡рддрдГ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ SwiftUIред

рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдХреЛрдб Github рдкрд░ рд╣реИ ред

рдирд┐рд╖реНрдХрд░реНрд╖

рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдврд╛рдВрдЪреЗ CombineрддреБрдо рдмрд╣реБрдд рдмрд╕ рдФрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ MVVMрджреЛрдиреЛрдВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ SwiftUIрдореЗрдВ UIKitрдФрд░ рд╕рдордЭрдиреЗ рдФрд░ рдкрдардиреАрдп рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВред

рд▓рд┐рдВрдХ:

рд╕рдВрдпреБрдХреНрдд + UIKit + MVVM
рдХрдВрдмрд╛рдЗрди
рдЖрдИрдУрдПрд╕ рдПрдорд╡реАрд╡реАрдПрдо рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ : рдЖрдИрд╡реАрдПрд╕ рдкреАрдПрд╕ рдХреЗ
рд▓рд┐рдП рдХрдВрдмрд╛рдЗрди рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд╕рд╛рде рдПрдорд╡реАрд╕реА рдПрдорд╡реАрд╡реАрдПрдо рд╕реЗ рд░рд┐рдлрд╝реЗрдХреНрдЯ

рдХрд░рдирд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рдореМрд╕рдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдУрдкрдирд╡реЗрд░рдкреЗрдЬрд╝ рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛  рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ API keyред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрдкрдХреЛ 2 рдорд┐рдирдЯ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛ред

All Articles