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

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

рд░рд╛рдп
рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб, XIB, рдпрд╛ UI рддрддреНрд╡ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред
ViewController
рдХреЗрд╡рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░
рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ред рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ, рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди, рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ, рдЖрджрд┐ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп
рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдореЗрдВ
рд╡реНрдпреВ , рдбрд┐рд╕реНрдкреНрд▓реЗ рдпрд╛ рдбреЗрдЯрд╛ (рдмрд┐рдирд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рдЪреЗрдХ рдХреЗ) рднреЗрдЬрдирд╛ рд╣реИред
Interactor
рдЗрд╕рдореЗрдВ рджреГрд╢реНрдп рдХрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ, рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЗрдВрдЯрд░рдПрдХреНрдЯрд░
ViewController (рдбреЗрдЯрд╛ рдпрд╛ рдЦрд╛рд▓реА) рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ
рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛
рд╡рд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдлреЛрди рдирдВрдмрд░ рдкрд░ рдПрдХ рдореБрдЦреМрдЯрд╛ рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рд╢реАрд░реНрд╖рдХ рдкреВрдВрдЬреА рдореЗрдВ рдкрд╣рд▓рд╛ рдЕрдХреНрд╖рд░ рдмрдирд╛рдПрдВред
рдпрд╣
рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ
рд╡реНрдпреВрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬрддрд╛ рд╣реИред
рдореЙрдбрд▓
рд╡реАрдЖрдИрдкреА рдЪрдХреНрд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред рдЪрдХреНрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реГрддреНрдд рдореЗрдВ 3 рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реИрдВ:
- рдЕрдиреБрд░реЛрдз - ViewController рд╕реЗ рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ (TextField рд╕реЗ рдкрд╛рда, рдЖрджрд┐)
- рдЙрддреНрддрд░ - рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ (рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЖрджрд┐)
- ViewModel - ViewController рдореЗрдВ рд╡рд╛рдкрд╕ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдбреЗрдЯрд╛ (рдкрд╛рда рд╕реНрд╡рд░реВрдкрдг, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛
рдордЬрд╝рджреВрд░
рдпрджрд┐ рдЗрдВрдЯрд░рдкреНрд░реЗрдирд░ рддреЗрдЬреА рд╕реЗ рдмрдврд╝ рд░рд╣рд╛
рд╣реИ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЙрддрд╛рд░рддрд╛ рд╣реИред
рдЖрдк рдРрд╕реЗ
рд╢реНрд░рдорд┐рдХ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдВ, рдпрджрд┐ рдЙрдирдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ,
рд╡рд░реНрдХрд░ рдореЗрдВ, рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд░реВрдЯрд░
рд░рд╛рдЙрдЯрд░ рдХреЗ рдмреАрдЪ рдмрджрд▓рд╛рд╡ рдФрд░ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рднреА рддрд░реНрдХ
рд░рд╛рдЙрдЯрд░ рдореЗрдВ рд▓рд┐рдП рдЧрдП рд╣реИрдВ ред
рд╡реАрдЖрдИрдкреА рдЪрдХреНрд░ рдХреА рддрд╕реНрд╡реАрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдорд╛рдирдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ - рдкреНрд░рд╛рдзрд┐рдХрд░рдгред
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЕрдкрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд┐рдпрд╛, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛
- ViewController IBAction рдЖрдЧ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж TextFields, (рдореЙрдбрд▓>>) рдореЗрдВ рджрд░реНрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ
- рдирд┐рд░реНрдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рдЗрдВрдЯрд░рдЪреЛрд░ рдореЗрдВ рднреНрд░реВрдг рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ
- рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рд╕рдлрд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
- рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддрд╛ рд╣реИ (рдореЙрдбрд▓ -> рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛) рдФрд░ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдореЙрдбрд▓ -> ViewModel) ViewController рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдПред
- ViewController рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рд░рд╛рдЙрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рджреГрд╢реНрдп рдХреЛ рд╕рдВрдХреНрд░рдордг рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдШрдЯрдХреЛрдВ рдореЗрдВ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рдФрд░ рд╕реБрд╕рдВрдЧрдд рд╕рдВрд░рдЪрдирд╛ рдорд┐рд▓рддреА рд╣реИред
рдЕрднреНрдпрд╛рд╕
рдЕрдм рдПрдХ рдЫреЛрдЯреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐
рд╡реАрдЖрдИрдкреА рдЪрдХреНрд░ рдХреИрд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рджреГрд╢реНрдп (рд╕реНрдХреНрд░реАрди) рдЦреЛрд▓рддреЗ рд╕рдордп рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВрдЧреЗред рдореИрдВрдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдореБрдЦреНрдп рдЦрдВрдбреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ред
рд╕рдВрдкреВрд░реНрдг
рд╡реАрдЖрдИрдкреА рдЪрдХреНрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдмрдВрдзрд╛ рд╣реИ, рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдПрдХ
DisplayLogic рдкреНрд░реЛрдЯреЛрдХреЙрд▓
ViewController рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рд▓рд┐рдВрдХ рдЬрд┐рд╕реЗ
рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЛ рдмрд╛рдж рдореЗрдВ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП , рджреЛ
BusinessLogic рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░
рд░рд╛рдЙрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдФрд░ рджреГрд╢реНрдп рдХреЛ
рдЗрдВрдЯрд░рдПрдХреНрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рд╡реНрдпреВ рдХреЙрдиреНрдЯреНрд░реЛрд▓рд░ рдФрд░ рдбреЗрдЯрд╛
рд╕реНрд░реЛрдд рд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛
рд╕рд╣рднрд╛рдЧрд┐рддрд╛рдХрд░реНрддрд╛ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
PresentationLogic рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИред рдЗрд╕ рд╕рдм рдХрд╛ рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рддрддреНрд╡
рдореЙрдбрд▓ рд╣реИ ред рдЗрд╕рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ
рд╡реАрдЖрдИрдкреА рдЪрдХреНрд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕реВрдЪрдирд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред

рдореЙрдбрд▓
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
рд╣реЛрдо рд╕реАрди рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ
рд╣реЛрдордореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд┐рд╕рдореЗрдВ
рд╡реАрдЖрдИрдкреА рд▓реВрдк рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред
FetchUser рдЕрдиреБрд░реЛрдз рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдЖрдЧреЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
| // Models |
| /// VIP |
| enum HomeModels { |
| |
| /// VIP |
| enum FetchUser { |
| |
| /// Interactor View Controller |
| struct Request { |
| let userName: String |
| } |
| |
| /// Presentor Interactor |
| struct Response { |
| let userPhone: String |
| let userEmail: String |
| } |
| |
| /// View Controller Presentor |
| struct ViewModel { |
| let userPhone: String |
| let userEmail: String |
| } |
| } |
| } |
ViewController
рдЬрдм рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рд╕реАрди рдХреЗ
рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдФрд░
рдкреНрд░реЗрдЬреЗрдВрдЯрд░ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЛ
рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
ViewController'e рдореЗрдВ рдЖрдЧреЗ
рдЗрдВрдЯрд░рдПрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд▓рд┐рдВрдХ рд╣реИред рдЗрд╕ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо
VIP рд╕рд╛рдЗрдХрд┐рд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдЗрдВрдЯрд░рдЪреНрдпреЛрд░ рдореЗрдВ
fetchUser (рдЕрдиреБрд░реЛрдз :) рд╡рд┐рдзрд┐
) рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз
рдмрдирд╛рдПрдВрдЧреЗ ред
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐
рд╕рд╣рднрд╛рдЧрд┐рддрд╛рдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред
LoadUserInfromation () рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо
рдЕрдиреБрд░реЛрдз рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣
TextField , рдЯреЗрдмрд▓, рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдиреБрд░реЛрдз рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
fetchUser (рдЕрдиреБрд░реЛрдз :) рд╡рд┐рдзрд┐, рдЬреЛ рд╣рдорд╛рд░реЗ
рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдХреЗ
BusinessLogic рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╣реИ, рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
| // ViewController |
| /// |
| protocol HomeDisplayLogic: class { |
| |
| /// |
| func displayUser(_ viewModel: HomeModels.FetchUser.ViewModel) |
| } |
| |
| final class HomeViewController: UIViewController { |
| |
| /// Interactor'a |
| var interactor: HomeBusinessLogic? |
| |
| override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { |
| super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) |
| setup() |
| } |
| |
| required init?(coder aDecoder: NSCoder) { |
| super.init(coder: aDecoder) |
| setup() |
| } |
| |
| /// |
| private func setup() { |
| // VIP |
| let interactor = HomeInteractor() |
| let presenter = HomePresenter() |
| |
| // |
| interactor.presenter = presenter |
| presenter.viewController = self |
| |
| // Interactor View Controller |
| self.interactor = interactor |
| } |
| |
| override func viewDidLoad() { |
| super.viewDidLoad() |
| |
| // |
| fetchUser() |
| } |
| |
| /// Interactor |
| private func loadUserInfromation() { |
| // Interactor |
| let request = HomeModels.FetchUser.Request(userName: "Aleksey") |
| |
| // Interactor'a |
| interactor?.fetchUser(request) |
| } |
| } |
| |
| /// HomeDisplayLogic |
| extension HomeViewController: HomeDisplayLogic { |
| |
| func displayUser(_ viewModel: HomeModels.FetchUser.ViewModel) { |
| print(viewModel) |
| } |
| } |
Interactor
рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ
PresentationLogic рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд▓рд┐рдВрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рддрд╣рдд
рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВред
FetchUser (рдЕрдиреБрд░реЛрдз :) рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рдП рд╣реИрдВ, рдХрдерд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рдеред
рдЙрд╕реА рд╡рд┐рдзрд┐ рдореЗрдВ,
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдмрд╛рджреА рд╣реИред
PresentULser (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ :) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
PresentationLogic рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреА
рдЬрд╛рддреА рд╣реИ ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ рдорд┐рд▓рд╛ рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП
рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рднреЗрдЬ рджрд┐рдпрд╛ рдЧрдпрд╛ред
| // Interactor |
| /// Interactor'a |
| protocol HomeBusinessLogic: class { |
| |
| /// |
| func fetchUser(_ request: HomeModels.FetchUser.Request) |
| } |
| |
| final class HomeInteractor: HomeBusinessLogic { |
| |
| /// |
| var presenter: HomePresentationLogic? |
| |
| func fetchUser(_ request: HomeModels.FetchUser.Request) { |
| // |
| // |
| let userPhone = "+7 (999) 111-22-33" |
| let userEmail = "im@alekseypleshkov.ru" |
| // ... |
| // Presentor' |
| let response = HomeModels.FetchUser.Response(userPhone: userPhone, userEmail: userEmail) |
| |
| // Presentor' |
| presenter?.presentUser(response) |
| } |
| } |
рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛
рдЗрд╕рдореЗрдВ
DisplayLogic рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд▓рд┐рдВрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рддрд╣рдд
ViewController рд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдлреЛрди рдирдВрдмрд░ рдХреЛ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛,
ViewModel рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рддреИрдпрд╛рд░ рдХрд┐рдпрд╛, рдФрд░ рдЗрд╕реЗ
DisplayCogic рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ
DisplayUser (viewModel :) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
ViewController рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реИред
| /// |
| protocol HomePresentationLogic: class { |
| |
| /// Interactor'a |
| func presentUser(_ response: HomeModels.FetchUser.Response) |
| } |
| |
| final class HomePresenter: HomePresentationLogic { |
| |
| /// View Controller'a |
| weak var viewController: HomeDisplayLogic? |
| |
| func presentUser(_ response: HomeModels.FetchUser.Response) { |
| // |
| let formattedPhone = response.userPhone.replacingOccurrences(of: "-", with: " ") |
| |
| // ViewModel View Controller |
| let viewModel = HomeModels.FetchUser.ViewModel(userPhone: formattedPhone, userEmail: response.userEmail) |
| |
| // View Controller'a |
| viewController?.displayUser(viewModel) |
| } |
| } |
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ, рдЖрд╡реЗрджрди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд░реНрдЧреЛрдВ рдХреА рдкреНрд░рддрд┐рдХреГрддрд┐рддрд╛ рдФрд░ рдПрдХ рдЯреАрдо рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред
рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд▓реЗрдЦреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛
- рд╕реНрд╡рдЪреНрдЫ рд╕реНрд╡рд┐рдлреНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рд╕рдордЭрдирд╛ (рдЖрдк рдпрд╣рд╛рдВ рд╣реИрдВ)
- рд╕реНрд╡рдЪреНрдЫ рд╕реНрд╡рд┐рдлреНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рд░рд╛рдЙрдЯрд░ рдФрд░ рдбреЗрдЯрд╛ рдкрд╛рд╕рд┐рдВрдЧ
- рдХреНрд▓реАрди рд╕реНрд╡рд┐рдлреНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛
- рд╕реНрд╡рдЪреНрдЫ рд╕реНрд╡рд┐рдлреНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг
- рдПрдХ рд╕рд░рд▓ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреНрд▓реАрди рд╕реНрд╡рд┐рдлреНрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рджреГрд╢реНрдп рдХреЗ рд╕рднреА рдШрдЯрдХ:
рд▓рд┐рдВрдХрдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж:
рдмрд╛рд╕реНрдЯрд┐рдпрди