рд╕реНрд╡рдЪреНрдЫ рд╕реНрд╡рд┐рдлреНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЕрд╡рд▓реЛрдХрди

рдирдорд╕реНрдХрд╛рд░ рдкрд╛рдардХ рдЬреА!

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



рд╕рд┐рджреНрдзрд╛рдВрдд


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

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



рд░рд╛рдп


рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб, XIB, рдпрд╛ UI рддрддреНрд╡ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред

ViewController


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

Interactor


рдЗрд╕рдореЗрдВ рджреГрд╢реНрдп рдХрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИред

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

рдЗрдВрдЯрд░рдПрдХреНрдЯрд░ ViewController (рдбреЗрдЯрд╛ рдпрд╛ рдЦрд╛рд▓реА) рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛


рд╡рд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рд╣реИрдВред

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

рдореЙрдбрд▓


рд╡реАрдЖрдИрдкреА рдЪрдХреНрд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред рдЪрдХреНрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реГрддреНрдд рдореЗрдВ 3 рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реИрдВ:

  • рдЕрдиреБрд░реЛрдз - ViewController рд╕реЗ рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ (TextField рд╕реЗ рдкрд╛рда, рдЖрджрд┐)
  • рдЙрддреНрддрд░ - рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ (рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЖрджрд┐)
  • ViewModel - ViewController рдореЗрдВ рд╡рд╛рдкрд╕ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдбреЗрдЯрд╛ (рдкрд╛рда рд╕реНрд╡рд░реВрдкрдг, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛

рдордЬрд╝рджреВрд░


рдпрджрд┐ рдЗрдВрдЯрд░рдкреНрд░реЗрдирд░ рддреЗрдЬреА рд╕реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЙрддрд╛рд░рддрд╛ рд╣реИред

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд░реНрдХрд░ рдореЗрдВ, рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд░реВрдЯрд░


рд░рд╛рдЙрдЯрд░ рдХреЗ рдмреАрдЪ рдмрджрд▓рд╛рд╡ рдФрд░ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рднреА рддрд░реНрдХ рд░рд╛рдЙрдЯрд░ рдореЗрдВ рд▓рд┐рдП рдЧрдП рд╣реИрдВ ред



рд╡реАрдЖрдИрдкреА рдЪрдХреНрд░ рдХреА рддрд╕реНрд╡реАрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдорд╛рдирдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ - рдкреНрд░рд╛рдзрд┐рдХрд░рдгред

  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЕрдкрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд┐рдпрд╛, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛
  2. ViewController IBAction рдЖрдЧ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж TextFields, (рдореЙрдбрд▓>>) рдореЗрдВ рджрд░реНрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ
  3. рдирд┐рд░реНрдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рдЗрдВрдЯрд░рдЪреЛрд░ рдореЗрдВ рднреНрд░реВрдг рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ
  4. рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рд╕рдлрд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
  5. рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддрд╛ рд╣реИ (рдореЙрдбрд▓ -> рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛) рдФрд░ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  6. рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдореЙрдбрд▓ -> ViewModel) ViewController рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдПред
  7. 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)
}
}

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


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

рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд▓реЗрдЦреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛


  1. рд╕реНрд╡рдЪреНрдЫ рд╕реНрд╡рд┐рдлреНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рд╕рдордЭрдирд╛ (рдЖрдк рдпрд╣рд╛рдВ рд╣реИрдВ)
  2. рд╕реНрд╡рдЪреНрдЫ рд╕реНрд╡рд┐рдлреНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рд░рд╛рдЙрдЯрд░ рдФрд░ рдбреЗрдЯрд╛ рдкрд╛рд╕рд┐рдВрдЧ
  3. рдХреНрд▓реАрди рд╕реНрд╡рд┐рдлреНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛
  4. рд╕реНрд╡рдЪреНрдЫ рд╕реНрд╡рд┐рдлреНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг
  5. рдПрдХ рд╕рд░рд▓ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреНрд▓реАрди рд╕реНрд╡рд┐рдлреНрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

рджреГрд╢реНрдп рдХреЗ рд╕рднреА рдШрдЯрдХ: рд▓рд┐рдВрдХ
рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж: рдмрд╛рд╕реНрдЯрд┐рдпрди

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


All Articles