рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╛рдЙрдВрдб рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХреИрд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛рдП



рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореЗрд░рд╛ рдирд╛рдо рдЗрд▓реНрдпрд╛ рд╣реИ, рдореИрдВ Tinkoff.ru рдкрд░ рдПрдХ iOS рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░рдд рдореЗрдВ рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ?


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

рдЬреАрд╡рди рдЙрджрд╛рд╣рд░рдг


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

рд░рд╛рдЙрдЯрд░ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдо рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ - рд╡рд╣ рд╡рд┐рдзрд┐ рдЬреЛ рд╕реНрдХреНрд░реАрди рдХреЛ рдмрдВрдж рдХрд░рддреА рд╣реИ:

func close() { self.transitionHandler.dismiss(animated: true, completion: nil) } 

рдпрд╣ рдХрдИ рд░рд╛рдЙрдЯрд░реНрд╕ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

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

рд╡рд┐рд░рд╛рд╕рдд рд╕реЗ рдмреЗрд╣рддрд░ рдХреНрдпрд╛ рд╣реИ? рдмреЗрд╢рдХ рд░рдЪрдирд╛ред

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

 struct CloseRouter { let transitionHandler: UIViewController func close() { self.transitionHandler.dismiss(animated: true, completion: nil) } } 

рд╣рдореЗрдВ рдЕрднреА рднреА рд░рд╛рдЙрдЯрд░ рдХреЗ рдЗрдирдкреБрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд░рд╛рдЙрдЯрд░ рдореЗрдВ рд╣реА рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 protocol SomeRouterInput { func close() } class SomeRouter: SomeRouterInput { var transitionHandler: UIViewController! lazy var closeRouter = { CloseRouter(transitionHandler: self. transitionHandler) }() func close() { self.closeRouter.close() } } 

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

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдорд╛рдзрд╛рди


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

рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 protocol CloseRouterTrait { var transitionHandler: UIViewController! { get } func close() } extension CloseRouterTrait { func close() { self.transitionHandler.dismiss(animated: true, completion: nil) } } 

рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдирд╛рдо рдкрд░ рд╢рдмреНрдж рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреНрдпреЛрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ? рдпрд╣ рд╕рд░рд▓ рд╣реИ - рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╡реЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдм, рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛:

 class SomeRouter: CloseRouterTrait { var transitionHandler: UIViewController! } 

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

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ?


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

рдпрд╣рд╛рдБ рдореЗрд░реА рд╕реВрдЪреА рд╣реИ:

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

VIPER рд╕реЗ MVP рддрдХ


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

 class SomeRouter: CloseRouterTrait, OtherRouterTrait { var transitionHandler: UIViewController! } class SomeInteractor: SomeInteractorTrait { var someService: SomeServiceInput! } 

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

рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

 class SomePresenter: CloseRouterTrait, OtherRouterTrait, SomeInteractorTrait, OtherInteractorTrait { var transitionHandler: UIViewController! var someService: SomeSericeInput! } 

рд╣рд╛рдВ, рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╛рдЙрдЯрд░ рдФрд░ рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЦреЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИред

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

рдмрджрд▓рддреЗ рд╡реНрдпрд╡рд╣рд╛рд░


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдпрд╛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдареВрдВрда рдХреЗ рд▓рд┐рдПред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рд▓реЗрдВ:

 protocol SomeInteractorTrait { var someService: SomeServiceInput! { get } func performRequest(completion: @escaping (Response) -> Void) } extension SomeInteractorTrait { func performRequest(completion: @escaping (Response) -> Void) { someService.performRequest(completion) } } 

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

 protocol Mock {} extension SomeInteractorTrait where Self: Mock { func performRequest(completion: @escaping (Response) -> Void) { completion(MockResponse()) } } 

рдпрд╣рд╛рдВ, Mock рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП PerformRequest рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдореЙрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ SomeInteractor рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛:

 class SomePresenter: SomeInteractorTrait, Mock { // Implementation } 

SomePresenter рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, PerformRequest рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рд╕реНрдерд┐рдд рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдБ рд╕реНрд╡рдпрдВ Mock рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдореЙрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдФрд░ PerformRequest рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ SomeInteractor рддрдХ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

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


рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рдЪрд▓рд┐рдП рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ:

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

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

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

рдЗрд╕ рдирд┐рд░реНрдгрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рдирд┐рдЬреА рдорд╛рдорд▓рд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдЕрдиреБрднрд╡ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдФрд░ рд╕реБрд▓рдЭреА рд╣реБрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВред

рд╡рд╣ рд╕рдм рд╣реИ!

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


All Articles