рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдПрдХ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рдкреИрдЯрд░реНрди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдШрдЯрдХреЛрдВ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕реНрд╡рд┐рдлреНрдЯ рдЖрдкрдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдмрд╣реБрдд рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдл рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЬ рдореИрдВ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдврд╛рдВрдЪреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - DITranquillity
ред
рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛:
- рдкрдВрдЬреАрдХрд░рдг рдЯрд╛рдЗрдк рдХрд░реЗрдВ
- рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддреИрдирд╛рддреА
- рдПрдХ рдЪрд░ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛
- рдШрдЯрдХ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛
UIStoryboard
рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдШрдЯрдХ рд╡рд┐рд╡рд░рдг
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдореБрдЦреНрдп рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ: ViewController
, Router
, Presenter
, Networking
- рдпреЗ рдХрд┐рд╕реА рднреА iOS рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рдШрдЯрдХ рд╣реИрдВред
ViewController
рдФрд░ Router
рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдЪрдХреНрд░реАрдп рд░реВрдк рд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЯреНрд░реЗрдирд┐рдВрдЧ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Xcode рдореЗрдВ рдПрдХ рд╕рд┐рдВрдЧрд▓ рд╡реНрдпреВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ, рдХреЛрдХреЛрдЖрдкреЛрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ DITranquillity рдЬреЛрдбрд╝реЗрдВред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдПрдВ, рдлрд┐рд░ Main.storyboard рдореЗрдВ рдПрдХ рджреВрд╕рд░рд╛ рдирд┐рдпрдВрддреНрд░рдХ рдЬреЛрдбрд╝реЗрдВ рдФрд░ StoryboardSegue
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП:
рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдмрдирд╛рдПрдВ:
рдШрдЯрдХ рдШреЛрд╖рдгрд╛ protocol Presenter: class { func getCounter(completion: @escaping (Int) -> Void) } class MyPresenter: Presenter { private let networking: Networking init(networking: Networking) { self.networking = networking } func getCounter(completion: @escaping (Int) -> Void) {
protocol Networking: class { func fetchData(completion: @escaping (Result<Int, Error>) -> Void) } class MyNetworking: Networking { func fetchData(completion: @escaping (Result<Int, Error>) -> Void) {
protocol Router: class { func presentNewController() } class MyRouter: Router { unowned let viewController: ViewController init(viewController: ViewController) { self.viewController = viewController } func presentNewController() {
class ViewController: UIViewController { var presenter: Presenter! var router: Router! }
рдкреНрд░рддрд┐рдмрдВрдз
рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, ViewController
рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди UIStoryboard.instantiateViewController
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдВрджрд░ UIKit рдкреБрд╕реНрддрдХрд╛рд▓рдп рджреНрд╡рд╛рд░рд╛, рдЗрд╕рд▓рд┐рдП, рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо UIStoryboard.instantiateViewController
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ UIViewController
рдХреЗ рд╡рд╛рд░рд┐рд╕реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдпрд╣ UIView
рдФрд░ UITableViewCell
рдХреЗ рд╡рд╛рд░рд┐рд╕реЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреА рд╣реБрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ - рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди
рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рднреА рдШрдЯрдХ рдмрдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрдкрд╕ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред DITranquillity рдореЗрдВ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ DIContainer
, рдЬреЛ container.register(...)
. DIContainer
container.register(...)
рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DIFramework
рдФрд░ DIPart
, рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ ApplicationDependency
рдирд┐рд░реНрднрд░рддрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ DIFramework
рдХреЛ рд▓рд╛рдЧреВ DIFramework
рдФрд░ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдЬреАрдХрд░рдг рд╕реНрдерд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред DIFramework
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ - load(container:)
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
class ApplicationDependency: DIFramework { static func load(container: DIContainer) {
рдЖрдЗрдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рд╛рдЗрдирдЕрдк рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬрд┐рд╕рдХреА рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИ - MyNetworking
container.register(MyNetworking.init)
рдпрд╣ рдкрдВрдЬреАрдХрд░рдг рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдШрдЯрдХ рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреА рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдШрдЯрдХ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд░рдВрднреАрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕реА рддрд░рд╣, MyPresenter
рдФрд░ MyRouter
рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВред
container.register1(MyPresenter.init) container.register1(MyRouter.init)
рдиреЛрдЯ: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ register
рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди register1
ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ 0 рдпрд╛ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдмрд╕ register
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рд╕реНрд╡рд┐рдлреНрдЯ рд╕рдВрд╕реНрдХрд░рдг 4.0 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХрд╛ рдПрдХ рдмрдЧ рд╣реИред
рдпрд╣ рд╣рдорд╛рд░реЗ ViewController
рдкрдВрдЬреАрдХрд░рдг рдХрд╛ рд╕рдордп рд╣реИред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕реАрдзреЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рд╡рд┐рд╡рд░рдг рдереЛрдбрд╝рд╛ рдФрд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред
container.register(ViewController.self) .injection(cycle: true, \.router) .injection(\.presenter)
рдкреНрд░рдкрддреНрд░ \.presenter
рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ SwiftKeyPath рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЪреВрдВрдХрд┐ Router
рдФрд░ ViewController
рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдЪрдХреНрд░реАрдп рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░ ViewController
, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ cycle: true
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХреЗрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП cycle: true
ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрд╡рдпрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рдХреЗ рдмрд┐рдирд╛ рдЗрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЗрд╕рд▓рд┐рдП рд╢реБрд░реВ рдХреА рдЧрдИ рдереА рддрд╛рдХрд┐ рдЧреНрд░рд╛рдлрд╝ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рддреБрд░рдВрдд рд╕рдордЭ рдореЗрдВ рдЖ рдЬрд╛рдП рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЪрдХреНрд░ рд╣реИрдВред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ViewController.init
рдирд╣реАрдВ ViewController.init
, рд▓реЗрдХрд┐рди ViewController.self
ред рдпрд╣ рд╕реАрдорд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ UIStoryboard
рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред
container.registerStoryboard(name: "Main")
рдЕрдм рд╣рдордиреЗ рдПрдХ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдл рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдЧреНрд░рд╛рдл рдХреА рдЕрднреА рддрдХ рдХреЛрдИ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдПрдХ DIContainer
рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
static let container: DIContainer = { let container = DIContainer()
- рдХрдВрдЯреЗрдирд░ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ
- рдЗрд╕рдореЗрдВ рдЧреНрд░рд╛рдл рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝реЗрдВред
- рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдХрд┐рдпрд╛ред рдпрджрд┐ рдХреЛрдИ рдЧрд▓рддреА рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЖрд╡реЗрджрди рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЧреНрд░рд╛рдлрд╝ рдмрдирд╛рддреЗ рд╕рдордп рддреБрд░рдВрдд рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛
рдлрд┐рд░ рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, AppDelegate
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд▓реЙрдиреНрдЪ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ Main.storyboard
рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп didFinishLaunchingWithOptions
рдореЗрдВ didFinishLaunchingWithOptions
рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) let storyboard: UIStoryboard = ApplicationDependency.container.resolve() window?.rootViewController = storyboard.instantiateInitialViewController() window?.makeKeyAndVisible() return true }
рд▓рд╛рдВрдЪ
рдкрд╣рд▓реА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдПрдХ рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдПрдЧреА рдФрд░ рд╕рддреНрдпрд╛рдкрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛:
- рдХрдВрдЯреЗрдирд░ рдХреЛ
Router
, Presenter
, Networking
рдХреЗ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдП рд╣реИрдВред рдпрджрд┐ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдПрдХреНрд╕реЗрд╕ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╣рд▓ рд╣реЛрдиреЗ рдкрд░ рдХрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ - рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рддрд╣рдд рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╡рд┐рдзрд┐ рдЙрдкрд▓рдмреНрдз рд╣реИред
container.register(MyNetworking.init) .as(check: Networking.self) {$0}
рдкрдВрдЬреАрдХрд░рдг рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрддрд╛рддреЗ рд╣реБрдП, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ: Networking
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ MyNetworking
рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реБрд▓рдн рд╣реИред рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рддрд╣рдд рдЫрд┐рдкреА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред {$0}
рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рд╣реА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рджреВрд╕рд░реА рдЧрд▓рддреА рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рддрдерд╛рдХрдерд┐рдд scope
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд┐рддрдиреА рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐рддрдирд╛ рд░рд╣рддрд╛ рд╣реИред рдПрдХ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ objectGraph
рдмрд░рд╛рдмрд░ рдПрдХ scope
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд╕реЗ рдХрдВрдЯреЗрдирд░ рдХреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╣рд░ рдмрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╣реА рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ:
container.register(ViewController.self) .injection(cycle: true, \.router) .injection(\.presenter) .lifetime(.objectGraph) container.register1(MyRouter.init) .as(check: Router.self) {$0} .lifetime(.objectGraph)
рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрдВрдЯреЗрдирд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рддреНрдпрд╛рдкрди рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░рд╛ ViewController рдирд┐рд░реНрдорд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдЦреБрд▓рддрд╛ рд╣реИред рдЖрдк viewDidLoad
рдореЗрдВ рдПрдХ рд╡рд┐рд░рд╛рдо рдмрд┐рдВрджреБ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдХреНрд░реАрди рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг
рдЗрд╕рдХреЗ рдмрд╛рдж, рджреЛ рдЫреЛрдЯреЗ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ, SecondViewController
рдФрд░ SecondPresenter
, рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдореЗрдВ SecondViewController
рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ "RouteToSecond"
, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ "RouteToSecond"
, рдЬреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рджреВрд╕рд░рд╛ рдирд┐рдпрдВрддреНрд░рдХ рдЦреЛрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдирдИ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА ApplicationDependency
рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рджреЛ рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдЬреЛрдбрд╝реЗрдВ:
container.register(SecondViewController.self) .injection(\.secondPresenter) container.register(SecondPresenter.init)
рд╣рдореЗрдВ .as
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреАрдЫреЗ SecondPresenter
рдХреЛ рдЫрд┐рдкрд╛рдпрд╛ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рд╕реАрдзреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдлрд┐рд░, рдкрд╣рд▓реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ viewDidAppear
рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо performSegue(withIdentifier: "RouteToSecond", sender: self)
, рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рджреВрд╕рд░рд╛ рдирд┐рдпрдВрддреНрд░рдХ рдЦреБрд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреВрд╕рд░реЗ performSegue(withIdentifier: "RouteToSecond", sender: self)
рдХреЛ рдЪрд┐рдкрдХрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдВрдЯреЗрдирд░ рдиреЗ UIStoryboard
рд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рджреЗрдЦрд╛ рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛, рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдд: рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬреЛ рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдл рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдФрд░ рд▓рдЪреАрд▓рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рджреЗрддрд╛ рд╣реИред
рд╕рдВрджрд░реНрдн
рдЧрд┐рдЯрд╣рдм рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреВрд░реНрдг рдирдореВрдирд╛ рдХреЛрдб
рдЧреАрдереБрдм рдкрд░ рдирд┐рдкреБрдгрддрд╛
рдЕрдВрдЧреНрд░реЗрдЬреА рд▓реЗрдЦ