рд╣рдо RaiffeisenBank iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдХреИрд╕реЗ рдЖрдПредрд╕рдорд╕реНрдпрд╛
Raiffeisenbank рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░реАрди рдореЗрдВ рдХрдИ рдореЙрдбреНрдпреВрд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрддреЗ рд╣реИрдВред "рдореЙрдбреНрдпреВрд▓" рд╣рдо рдПрдХ рджреГрд╢реНрдп рдШрдЯрдХ рдХрд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп, рддрд░реНрдХ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рддрд╛рдХрд┐ рдореЙрдбреНрдпреВрд▓ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗ рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рд╣рдореЗрдВ рдХрд┐рди рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛:
рд╡рд╛рд╕реНрддреБ рдкреИрдЯрд░реНрди рдкрд░ рдЕрдореВрд░реНрддрддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдкреИрдЯрд░реНрди рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗред рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ MVC рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдиреНрдпреВрдирддрдо рд╣реИ рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдкреЗрдЬ "рдХрдВрдкрдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ" рдпрд╛ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдордЭреМрддрд╛"ред VIPER рдЬрдЯрд┐рд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ, рд░реВрдЯрд┐рдВрдЧ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрдкрдирд╛ рддрд░реНрдХ рд╣реИред
рдмрд╛рддрдЪреАрдд рдФрд░ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдкреИрдЯрд░реНрди рдХреА рдЕрдкрдиреА рдирд┐рд░реНрдорд╛рдг рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИрдВ, рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореБрдЦреНрдп
рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рд░реВрдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХрджреГрд╢реНрдп рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрд╕реЗ рдХрд╣рд╛рдВ рдФрд░ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдФрд░ рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрдХреНрд░реАрди рдкрд░ рдпрд╛ рдПрдХ рд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╣реА рджреЛрд╖реА рдирд╣реАрдВ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкрд┐рдЫрд▓рд╛ рд╕рдорд╛рдзрд╛рди: // рдмреБрд░рд╛ рд╡реНрдпрд╡рд╕рд╛рдп
рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдЬреЛ рд╣рдордиреЗ Objective-C рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдФрд░ рдпрд╣ NSProxy рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ред рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓ рдкреИрдЯрд░реНрди рдХреЗ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдбрд┐рдлреЗрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рджрд┐рдП рдЧрдП рд╢рд░реНрддреЛрдВ, рдЕрд░реНрдерд╛рдд
рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд┐рд╕реА рднреА рдХреЙрд▓ рдХреЛ рдЙрд╕рдХреЗ
рдЗрдирдкреБрдЯ рдкрд░ рдкреНрд░реЙрдХреНрд╕реА рдХрд░рдирд╛ рдФрд░
рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рдпрд╛, рдпрджрд┐ рдХреЛрдИ рд╣реЛред
рдпрд╣ рдПрдХ рдХрджрдо рдЖрдЧреЗ рдерд╛, рд▓реЗрдХрд┐рди рдирдИ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЙрддреНрдкрдиреНрди рд╣реБрдИрдВ:
- рдкреНрд░реЙрдХреНрд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдиреЗ рдЗрдирдкреБрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреА;
- рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛, рднрд▓реЗ рд╣реА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ;
- рдЗрдирдкреБрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
NSProxy рдХреЗ рдЕрд▓рд╛рд╡рд╛
, рд╣рдордиреЗ
ViperMcFlurry рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд░реВрдЯрд┐рдВрдЧ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛: рд╣рдордиреЗ
ViewController рдкрд░ рдПрдХ рд╢реНрд░реЗрдгреА рдмрдирд╛рдИ, рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдореЙрдбреНрдпреВрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рд▓рдЧреАред рдмреЗрд╢рдХ, рд╣рдордиреЗ рд╢реНрд░реЗрдгреА рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЕрдЪреНрдЫреЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рджреВрд░ рдерд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ ... рдкрд╣рд▓рд╛ рдкреИрдирдХреЗрдХ рд▓рдореНрдкрдЯ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рд▓: // рдЕрдВрддрд┐рдо
рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реБрдП рдХрд┐
NSProxy рдХреЗ рд╕рд╛рде рдЖрдЧреЗ
рдХреБрдЫ рдирд╣реАрдВ рдерд╛, рд╣рдордиреЗ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЛ рд▓рд┐рдпрд╛ рдФрд░ рдбреНрд░рд╛ рдХрд░рдиреЗ рдЧрдПред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдордиреЗ
RFModule рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдЕрд▓рдЧ рдХрд┐рдпрд╛:
@objc protocol RFModule { var view: ViewController { get } var input: AnyObject? { get } var output: AnyObject? { get set } var transition: Transitioning { get set } }
рд╣рдордиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реНрддрд░ рдкрд░ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рдФрд░ рдЗрд╕рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рдерд╛: рдЙрд╕ рд╕рдордп, 90% рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдерд╛ред ObjC рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ тЖР тЖТ рд╕реНрд╡рд┐рдлреНрдЯ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЕрднреА рднреА рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ
рдореЙрдбреНрдпреВрд▓ рд╡рд░реНрдЧ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛
RFModule :
final class Module<I: Any, O: Any>: RFModule { public typealias Input = I public typealias Output = O public var setOutput: ((O?) -> Void)?
рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдкреНрдб рдореЙрдбреНрдпреВрд▓ рдорд┐рд▓рд╛ред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрд╡рд┐рдлреНрдЯ рд╡рд░реНрдЧ
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрджреНрджреЗрд╢реНрдп-рд╕реА
RFModule рдореЗрдВ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░
рдореИрд╢рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рдмрди рдЧрдпрд╛ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
TabContainer ред
рдЪреВрдВрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрдорд╛рдг DI рдпреВрдЬрд░рд╕реНрдЯреНрд░реЛрдХрд┐рдВрдЧ рд╕реНрдХреВрдкрд┐рдВрдЧ рдореЗрдВ рд╣реИ, рдФрд░ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реЗрдЯрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
"рд╕реЗрдЯрдУрдЯрдкреБрдЯ" , рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ
рдбрд┐рдлреЗрдХреНрд╢рди рд╣реИ, рдЬреЛ
рдЖрдЙрдЯрдкреБрдЯ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ
, рдореЙрдбреНрдпреВрд▓ рдХреЗ рддрд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕реЗ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред
class SomeViewController: UIViewController, ModuleInput { weak var delegate: ModuleOutput } class Assembly { func someModule() -> Module<ModuleInput, ModuleOutput> { let view = SomeViewController() let module = Module<ModuleInput, ModuleOutput>(view: view, input: view) { [weak view] output in view?.delegate = output } return module } } ... let assembly: Assembly let module = assembly.someModule() module.output = self
рд╕рдВрдХреНрд░рдордг рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдореЙрдбреНрдпреВрд▓ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдФрд░ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред
protocol Transitioning { var destination: ViewController? { get }
рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рд░рдг рд╣реИ -
рдкреНрд░рджрд░реНрд╢рди , рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП -
рд░рд┐рд╡рд░реНрд╕ ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ
рдЧрдВрддрд╡реНрдп рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
рд╕реНрд░реЛрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
рд╕реНрд░реЛрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрд╢рд╛
ViewController рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдореЗрдВ рдирдИ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣
рд╡рд┐рдВрдбреЛ рд╣реИ , рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ
рдПрдореНрдмреЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
ViewController рдФрд░ рдХрдВрдЯреЗрдирд░:
UIView ред
class PresentTransition: Transitioning { weak var source: ViewController? weak var destination: ViewController? ... func perform(_ completion: (()->())?) { source.present(viewController: self.destinaton) } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ
ViewController рдкрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдЗрд╕рдиреЗ рд╣рдореЗрдВ рд░реВрдЯрд┐рдВрдЧ рдореЗрдВ рд▓рдЪреАрд▓рд╛рдкрди рджрд┐рдпрд╛, рдЕрд░реНрдерд╛рдд рдЕрдм рд╣рдо рдХрд┐рд╕реА рднреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдФрд░ рдЬрдЯрд┐рд▓ рджреЛрдиреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ: рд╡рд┐рдВрдбреЛ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ (рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкрд░ рдкреБрд╢ рдХрд░реЗрдВ), рдПрдореНрдмреЗрдб рдХрд░реЗрдВ, рдкрд░реНрджреЗ рдореЗрдВ (рдХрд╡рд░) ред
рдХреНрдпрд╛ рд╡рд╣ рд╕рдм рд╣реИ?
рдПрдХ рдФрд░ рдмрд╛рдд рд╣реИ рдЬреЛ рдЕрдм рддрдХ рд╕рддрд╛ рд░рд╣реА рд╣реИред рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕ рддрд░реНрдХ рдХреЛ рдЗрд╕рд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЙрдкрд╕реНрдерд┐рддрд┐ рдЧреБрдгреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд░рдВрдЧ рдХреА
рдкрдЯреНрдЯреА рдкрдЯреНрдЯреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП; рдпрд╛, рдпрджрд┐ рд╣рдо рдкрд░реНрджреЗ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ
рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд░рдВрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдм рддрдХ, рд╣рдордиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдкреНрд░рддрд┐рд╖реНрдард┐рдд рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ: рдХреЛрдИ рднреА рд╕рдВрдкрддреНрддрд┐, рдФрд░ рдореЙрдбреНрдпреВрд▓ рдЦреЛрд▓рдиреЗ рдкрд░ рд╕рдВрдХреНрд░рдордг рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рд╕рдлрд▓ рд╣реБрдЖ, рддреЛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдЧреБрдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред