SwiftUI рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрдкрдирд╛рдирд╛ред рднрд╛рдЧ 3. рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛

рд╕рдмрдХреЗ рд▓рд┐рдП рджрд┐рди рдЕрдЪреНрдЫрд╛ рд╣реЛ! рдЖрдкрдХреЗ рд╕рд╛рде, рдореИрдВ, рдЕрдиреНрдирд╛ рдЭрд╛рд░рдХреЛрд╡рд╛, рдпреВрд╕реЗрдЯреЗрдХ рдХреЗ рдПрдХ рдкреНрд░рдореБрдЦ рдореЛрдмрд╛рдЗрд▓ рдбреЗрд╡рд▓рдкрд░ ред рд╣рдо рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ

рдХреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рд▓рд┐рдВрдХ рдкрд░ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

рднрд╛рдЧ 1
рднрд╛рдЧ 2

рдЖрдЬ рд╣рдо рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдФрд░ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдореЗрдВ рдорд╛рдирдХ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рд╡реНрдпреВ рдХреА рдмрд╛рддрдЪреАрдд рдФрд░ рдЧреБрдгреЛрдВ рдФрд░ рд░рд╛рдЬреНрдп рдЪрд░ рд╡рд╛рд▓реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореЙрдбрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдпрд╛ рдРрд╕рд╛ рдХреЛрдИ рд░рд╛рдЬреНрдп рдЪрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдПрдорд╡реАрд╡реАрдПрдо рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рднрд╛рдЧреАрджрд╛рд░ рд╣реИред рдРрдкреНрдкрд▓ рдЗрд╕реЗ рдХреЙрдореНрдмрд┐рдиреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рдгрд╛рддреНрдордХ рдПрдкрд┐ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред ViewModel ObservableObject рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП ObservedObject рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред



рд╕рдВрд╢реЛрдзрд┐рдд рдореЙрдбрд▓ рдЧреБрдгреЛрдВ рдХреЛ @ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

class NewsItemModel: ObservableObject {
    @Published var title: String = ""
    @Published var description: String = ""
    @Published var image: String = ""
    @Published var dateFormatted: String = ""
}

рдХреНрд▓рд╛рд╕рд┐рдХ MVVM рдХреА рддрд░рд╣, ViewModel рдбреЗрдЯрд╛ рдореЙрдбрд▓ (рдпрд╛рдиреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ) рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд░реВрдк рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рджреГрд╢реНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

struct NewsItemContentView: View {
    @ObservedObject var moder: NewsItemModel
    
    init(model: NewsItemModel) {
        self.model = model 
    }
    //... - 
}

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

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

рдЖрдЗрдП рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб рдФрд░ рд╕реНрд╡рдЪреНрдЫ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ MVVM рдХреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ, рдЖрдЦрд┐рд░рдХрд╛рд░, DataFlow SwiftUI рдЗрд╕ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реИред

рдЪреЗрддрд╛рд╡рдиреА!

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


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

рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╕рдмрд╕реЗ рдкрдардиреАрдп рдХреЛрдб рдмрдирд╛рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рддрдм рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рджрд░реНрдж рд░рд╣рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрд╛рдлреА рдХреБрдЫ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред



рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рдкреНрдпрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдХреЛрдИ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣реЛрд▓реАрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИред

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

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



рдпрджрд┐ рд╣рдордиреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХрд╛ рдЪрдпрди рдФрд░ рд╕рд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рднреА рдореМрдЬреВрджрд╛ рдкреИрдЯрд░реНрди рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред



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


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



рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╕рд╛рде VIP + R рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдорд┐рд▓рддреА рд╣реИред

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕
SwiftUI рдФрд░ MVVM рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рдорд╛рдЪрд╛рд░ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИред



рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде 3 рдЕрд▓рдЧ рд╕реНрдХреНрд░реАрди рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН 3 рдореЙрдбреНрдпреВрд▓:тАи

  • рд╕рдорд╛рдЪрд╛рд░ рд╕реВрдЪреА рдореЙрдбреНрдпреВрд▓;
  • рд╕рдорд╛рдЪрд╛рд░ рд╕реНрдХреНрд░реАрди рдореЙрдбреНрдпреВрд▓;
  • рд╕рдорд╛рдЪрд╛рд░ рдЦреЛрдЬ рдореЙрдбреНрдпреВрд▓ред

рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ ViewModel рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЪрдпрдирд┐рдд рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдФрд░ рдПрдХ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ ViewModel рдЗрд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред



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

рд╣рдо рдЗрди рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдФрд░ рдЗрдВрдЯрд░реИрдХреНрдЯрд░ рдХреЛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ
рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ ред



рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рд╕реЗрд╡рд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рднреЗрдЬрддрд╛ рд╣реИ, рдЬреЛ рдореМрдЬреВрджрд╛ ViewModel рдХреЛ рддреИрдпрд╛рд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╡реНрдпреВ рд╕реЗ рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЗ рдЕрд▓рдЧрд╛рд╡ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред тАи

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

  • рд╕реНрдХреНрд░реАрди рд╢реИрд▓рд┐рдпреЛрдВ
  • рдЖрдо рдпреВрдЖрдИ рддрддреНрд╡ (LoadingView);
  • рд╕реВрдЪрдирд╛ рдЕрд▓рд░реНрдЯ;
  • рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗред

рд╣рдо рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд░рдЪрдирд╛ рдХрд╛ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдпрд╣ рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рд╣реИ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдореЗрдВ рд╕рднреА рдХрд╕реНрдЯрдо рджреГрд╢реНрдп рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

рддреЛ, рд╣рдо рдПрдХ рд╡реНрдпреВ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рднреА рдПрдХ рд╣реА рд▓реЙрдЬрд┐рдХ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрдВрдЯреЗрдирд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдЕрдкрдирд╛ рдСрди-рд╕реНрдХреНрд░реАрди рд╡реНрдпреВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХрдВрдЯреЗрдВрдЯ рд╡реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

struct ContainerView<Content>: IContainer, View where Content: View {
    @ObservedObject var containerModel = ContainerModel()
    private var content: Content

    public init(content: Content) {
        self.content = content
    }

    var body : some View {
        ZStack {
            content
            if (self.containerModel.isLoading) {
                LoaderView()
            }
        }.alert(isPresented: $containerModel.hasError){
            Alert(title: Text(""), message: Text(containerModel.errorText),
                 dismissButton: .default(Text("OK")){
                self.containerModel.errorShown()
                })
        }
    }

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

рдЖрдВрддрд░рд┐рдХ рджреГрд╢реНрдп рдХреЗ ViewModel рд╕реЗ рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрдВрдЯреЗрдирд░ рд╡реНрдпреВ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо
рдЖрдВрддрд░рд┐рдХ рджреГрд╢реНрдп рдХреЗ рд╕рдорд╛рди рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП @Observed рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ , рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдЦреАрдВрдЪ рд▓реЗрдВрдЧреЗред



рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреИрдЯрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрдВрдЯреЗрдирд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрдВрдЯреЗрдирд░рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

class ContainerModel:ObservableObject {
    @Published var hasError: Bool = false
    @Published var errorText: String = ""
    @Published var isLoading: Bool = false
    
    func setupError(error: String){
     //....
       }
    
    func errorShown() {
     //...
    }
    
    func showLoading() {
        self.isLoading = true
    }
    
    func hideLoading() {
        self.isLoading = false
    }
}

рдХрдВрдЯреЗрдирд░ рджреГрд╢реНрдп IContainer рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рдВрджрд░реНрдн рдПрдореНрдмреЗрдбреЗрдб рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред

protocol  IContainer {
    func showError(error: String)
    
    func showLoading()
    
    func hideLoading()
}

struct ContainerView<Content>: IContainer, View where Content: View&IModelView {
    @ObservedObject var containerModel = ContainerModel()
    private var content: Content

    public init(content: Content) {
        self.content = content
        self.content.viewModel?.listener = self
    }
    //- 
}

рдореЙрдбрд▓ рдкрд╣реБрдВрдЪ рдХреЛ рдПрдиреНрдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рдиреЗ рдФрд░ рдХреБрдЫ рддрд░реНрдХ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IModelView рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╕рдорд╛рди рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ IModel рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

protocol IModelView {
    var viewModel: IModel? {get}
}

protocol  IModel:class {
   //....
    var listener:IContainer? {get set}
}

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

struct ContainerView<Content>: IContainer, View where Content: View&IModelView {
    @ObservedObject var containerModel = ContainerModel()
    private var content: Content

    //- 
    func showError(error: String) {
        self.containerModel.setupError(error: error)
    }
    
    func showLoading() {
        self.containerModel.showLoading()
    }
    
    func hideLoading() {
        self.containerModel.hideLoading()
    }
}

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

рдЖрдк рдпрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

All Articles