Implemented the coordinator flow for LocationsList and LocationAdd screens.

This commit is contained in:
Javier Cicchelli 2023-04-11 23:34:07 +02:00
parent b9417244a4
commit b73a8e1010
13 changed files with 172 additions and 81 deletions

View File

@ -24,7 +24,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
_ application: UIApplication, _ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool { ) -> Bool {
coordinator.present(animated: true, onDismiss: nil) coordinator.present(animated: false, onDismiss: nil)
return true return true
} }

View File

@ -9,7 +9,7 @@
import Core import Core
import UIKit import UIKit
class LocationsAddCoordinator: LocationsAddCoordinable { class LocationsAddCoordinator: Coordinator {
// MARK: Properties // MARK: Properties
@ -26,10 +26,16 @@ class LocationsAddCoordinator: LocationsAddCoordinable {
func present(animated: Bool, onDismiss: (() -> Void)?) { func present(animated: Bool, onDismiss: (() -> Void)?) {
router.present( router.present(
LocationsAddViewController(viewModel: .init(coordinator: self)), LocationsAddViewController(
viewModel: LocationsAddViewModel(coordinator: self)
),
animated: animated, animated: animated,
onDismiss: onDismiss onDismiss: onDismiss
) )
} }
} }
// MARK: - LocationsAddCoordination
extension LocationsAddCoordinator: LocationsAddCoordination {}

View File

@ -9,15 +9,15 @@
import Core import Core
import UIKit import UIKit
class LocationsListCoordinator: LocationsListCoordinable { class LocationsListCoordinator: Coordinator {
// MARK: Properties // MARK: Properties
var children: [Coordinator] = [] var children: [Coordinator] = []
var router: Router var router: Router
private var viewController: UIViewController? private var viewController: UIViewController?
// MARK: Initialisers // MARK: Initialisers
init(router: Router) { init(router: Router) {
@ -40,16 +40,25 @@ class LocationsListCoordinator: LocationsListCoordinable {
) )
} }
// MARK: LocationsListCoordinable }
// MARK: - LocationsListCoordination
extension LocationsListCoordinator: LocationsListCoordination {
func showAddLocation() { // MARK: Functions
func openAddLocation() {
guard let viewController else { guard let viewController else {
return return
} }
let router = ModalNavigationRouter(parentViewController: viewController) present(
let child = child: LocationsAddCoordinator(
print("ADD LOCATION PRESSED!") router: ModalNavigationRouter(parentViewController: viewController)
),
animated: true
)
} }
} }

View File

@ -1,11 +1,9 @@
// //
// LocationsAddCoordinable.swift // LocationsAddCoordination.swift
// Locations // Locations
// //
// Created by Javier Cicchelli on 11/04/2023. // Created by Javier Cicchelli on 11/04/2023.
// Copyright © 2023 Röck+Cöde. All rights reserved. // Copyright © 2023 Röck+Cöde. All rights reserved.
// //
import Core protocol LocationsAddCoordination: AnyObject {}
protocol LocationsAddCoordinable: Coordinator {}

View File

@ -1,17 +1,15 @@
// //
// LocationsListCoordinable.swift // LocationsListCoordination.swift
// Locations // Locations
// //
// Created by Javier Cicchelli on 11/04/2023. // Created by Javier Cicchelli on 11/04/2023.
// Copyright © 2023 Röck+Cöde. All rights reserved. // Copyright © 2023 Röck+Cöde. All rights reserved.
// //
import Core protocol LocationsListCoordination: AnyObject {
protocol LocationsListCoordinable: Coordinator {
// MARK: Functions // MARK: Functions
func showAddLocation() func openAddLocation()
} }

View File

@ -0,0 +1,15 @@
//
// LocationsAddViewModeling.swift
// Locations
//
// Created by Javier Cicchelli on 11/04/2023.
// Copyright © 2023 Röck+Cöde. All rights reserved.
//
protocol LocationsAddViewModeling: AnyObject {
// MARK: Properties
var coordinator: LocationsAddCoordination? { get set }
}

View File

@ -1,19 +1,19 @@
// //
// LocationsListViewModelable.swift // LocationsListViewModeling.swift
// Locations // Locations
// //
// Created by Javier Cicchelli on 11/04/2023. // Created by Javier Cicchelli on 11/04/2023.
// Copyright © 2023 Röck+Cöde. All rights reserved. // Copyright © 2023 Röck+Cöde. All rights reserved.
// //
protocol LocationsListViewModelable { protocol LocationsListViewModeling: AnyObject {
// MARK: Properties // MARK: Properties
var coordinator: LocationsListCoordinable? { get set } var coordinator: LocationsListCoordination? { get set }
// MARK: Functions // MARK: Functions
func addLocationPressed() func openAddLocation()
} }

View File

@ -9,18 +9,18 @@
import Core import Core
import UIKit import UIKit
class LocationsAddViewController: UIViewController { class LocationsAddViewController: BaseViewController {
// MARK: Properties // MARK: Properties
var viewModel: LocationsAddViewModel var viewModel: LocationsAddViewModeling
// MARK: Initialisers // MARK: Initialisers
init(viewModel: LocationsAddViewModel) { init(viewModel: LocationsAddViewModeling) {
self.viewModel = viewModel self.viewModel = viewModel
super.init(nibName: nil, bundle: nil) super.init()
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
@ -33,8 +33,6 @@ class LocationsAddViewController: UIViewController {
super.viewDidLoad() super.viewDidLoad()
title = "Location Add" title = "Location Add"
view.backgroundColor = .white
} }
} }

View File

@ -13,12 +13,16 @@ class LocationsAddViewModel: ObservableObject {
// MARK: Properties // MARK: Properties
var coordinator: Coordinator weak var coordinator: LocationsAddCoordination?
// MARK: Initialisers // MARK: Initialisers
init(coordinator: Coordinator) { init(coordinator: LocationsAddCoordination) {
self.coordinator = coordinator self.coordinator = coordinator
} }
} }
// MARK: - LocationsAddViewModeling
extension LocationsAddViewModel: LocationsAddViewModeling {}

View File

@ -9,18 +9,18 @@
import Core import Core
import UIKit import UIKit
class LocationsListViewController: UIViewController { class LocationsListViewController: BaseViewController {
// MARK: Properties // MARK: Properties
var viewModel: LocationsListViewModelable var viewModel: LocationsListViewModeling
// MARK: Initialisers // MARK: Initialisers
init(viewModel: LocationsListViewModelable) { init(viewModel: LocationsListViewModeling) {
self.viewModel = viewModel self.viewModel = viewModel
super.init(nibName: nil, bundle: nil) super.init()
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
@ -39,8 +39,6 @@ class LocationsListViewController: UIViewController {
action: #selector(addLocationPressed) action: #selector(addLocationPressed)
) )
title = "Locations" title = "Locations"
view.backgroundColor = .systemBackground
} }
} }
@ -48,7 +46,11 @@ class LocationsListViewController: UIViewController {
// MARK: - Helpers // MARK: - Helpers
private extension LocationsListViewController { private extension LocationsListViewController {
// MARK: Functions
@objc func addLocationPressed() { @objc func addLocationPressed() {
viewModel.addLocationPressed() viewModel.openAddLocation()
} }
} }

View File

@ -9,22 +9,28 @@
import Combine import Combine
import Core import Core
class LocationsListViewModel: ObservableObject, LocationsListViewModelable { class LocationsListViewModel: ObservableObject {
// MARK: Properties // MARK: Properties
weak var coordinator: LocationsListCoordinable? weak var coordinator: LocationsListCoordination?
// MARK: Initialisers // MARK: Initialisers
init(coordinator: LocationsListCoordinable) { init(coordinator: LocationsListCoordination) {
self.coordinator = coordinator self.coordinator = coordinator
} }
// MARK: Functions
func addLocationPressed() {
coordinator?.showAddLocation()
}
} }
// MARK: - LocationsListViewModeling
extension LocationsListViewModel: LocationsListViewModeling {
// MARK: Functions
func openAddLocation() {
coordinator?.openAddLocation()
}
}

View File

@ -0,0 +1,31 @@
//
// BaseViewController.swift
// Locations
//
// Created by Javier Cicchelli on 11/04/2023.
// Copyright © 2023 Röck+Cöde. All rights reserved.
//
import UIKit
class BaseViewController: UIViewController {
// MARK: Initialisers
init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: UIViewController
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
}
}

View File

@ -7,13 +7,15 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
02031EBF29E5F949003C108C /* LocationsAddViewModeling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02031EBE29E5F949003C108C /* LocationsAddViewModeling.swift */; };
02031EC629E5FEE4003C108C /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02031EC529E5FEE4003C108C /* BaseViewController.swift */; };
46C3B7C629E5BF1500F8F57C /* LocationsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */; }; 46C3B7C629E5BF1500F8F57C /* LocationsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */; };
46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */; }; 46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */; };
46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */; }; 46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */; };
46C3B7D129E5D06D00F8F57C /* LocationsAddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */; }; 46C3B7D129E5D06D00F8F57C /* LocationsAddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */; };
46C3B7D629E5E50500F8F57C /* LocationsListViewModelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D529E5E50500F8F57C /* LocationsListViewModelable.swift */; }; 46C3B7D629E5E50500F8F57C /* LocationsListViewModeling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D529E5E50500F8F57C /* LocationsListViewModeling.swift */; };
46C3B7D829E5E55000F8F57C /* LocationsListCoordinable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */; }; 46C3B7D829E5E55000F8F57C /* LocationsListCoordination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D729E5E55000F8F57C /* LocationsListCoordination.swift */; };
46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordinable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordinable.swift */; }; 46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordination.swift */; };
46C3B7DE29E5ED2E00F8F57C /* LocationsAddCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */; }; 46C3B7DE29E5ED2E00F8F57C /* LocationsAddCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */; };
46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331A29E1CE04001D5EAF /* AppDelegate.swift */; }; 46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331A29E1CE04001D5EAF /* AppDelegate.swift */; };
46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */; }; 46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */; };
@ -118,13 +120,15 @@
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
02031EBE29E5F949003C108C /* LocationsAddViewModeling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewModeling.swift; sourceTree = "<group>"; };
02031EC529E5FEE4003C108C /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = "<group>"; };
46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordinator.swift; sourceTree = "<group>"; }; 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordinator.swift; sourceTree = "<group>"; };
46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListViewModel.swift; sourceTree = "<group>"; }; 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListViewModel.swift; sourceTree = "<group>"; };
46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewModel.swift; sourceTree = "<group>"; }; 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewModel.swift; sourceTree = "<group>"; };
46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewController.swift; sourceTree = "<group>"; }; 46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewController.swift; sourceTree = "<group>"; };
46C3B7D529E5E50500F8F57C /* LocationsListViewModelable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListViewModelable.swift; sourceTree = "<group>"; }; 46C3B7D529E5E50500F8F57C /* LocationsListViewModeling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListViewModeling.swift; sourceTree = "<group>"; };
46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordinable.swift; sourceTree = "<group>"; }; 46C3B7D729E5E55000F8F57C /* LocationsListCoordination.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordination.swift; sourceTree = "<group>"; };
46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordinable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordinable.swift; sourceTree = "<group>"; }; 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordination.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordination.swift; sourceTree = "<group>"; };
46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordinator.swift; sourceTree = "<group>"; }; 46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordinator.swift; sourceTree = "<group>"; };
46EB325829E1BD5C001D5EAF /* Wikipedia.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Wikipedia.xcodeproj; path = Wikipedia/Wikipedia.xcodeproj; sourceTree = "<group>"; }; 46EB325829E1BD5C001D5EAF /* Wikipedia.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Wikipedia.xcodeproj; path = Wikipedia/Wikipedia.xcodeproj; sourceTree = "<group>"; };
46EB331829E1CE04001D5EAF /* Locations.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Locations.app; sourceTree = BUILT_PRODUCTS_DIR; }; 46EB331829E1CE04001D5EAF /* Locations.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Locations.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -152,12 +156,46 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
02031EC429E5FEB1003C108C /* View Controllers */ = {
isa = PBXGroup;
children = (
02031EC529E5FEE4003C108C /* BaseViewController.swift */,
);
path = "View Controllers";
sourceTree = "<group>";
};
0276C96029E5F5DC000B62AF /* Protocols */ = {
isa = PBXGroup;
children = (
0276C96229E5F5ED000B62AF /* Coordination */,
0276C96129E5F5E5000B62AF /* ViewModeling */,
);
path = Protocols;
sourceTree = "<group>";
};
0276C96129E5F5E5000B62AF /* ViewModeling */ = {
isa = PBXGroup;
children = (
02031EBE29E5F949003C108C /* LocationsAddViewModeling.swift */,
46C3B7D529E5E50500F8F57C /* LocationsListViewModeling.swift */,
);
path = ViewModeling;
sourceTree = "<group>";
};
0276C96229E5F5ED000B62AF /* Coordination */ = {
isa = PBXGroup;
children = (
46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordination.swift */,
46C3B7D729E5E55000F8F57C /* LocationsListCoordination.swift */,
);
path = Coordination;
sourceTree = "<group>";
};
46C3B7C429E5BEE900F8F57C /* Coordinators */ = { 46C3B7C429E5BEE900F8F57C /* Coordinators */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */,
46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */, 46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */,
46C3B7D929E5E7F900F8F57C /* Protocols */, 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */,
); );
path = Coordinators; path = Coordinators;
sourceTree = "<group>"; sourceTree = "<group>";
@ -165,8 +203,8 @@
46C3B7C929E5CB8F00F8F57C /* Screens */ = { 46C3B7C929E5CB8F00F8F57C /* Screens */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
46C3B7CC29E5CFBB00F8F57C /* LocationsList */,
46C3B7CD29E5CFCD00F8F57C /* LocationsAdd */, 46C3B7CD29E5CFCD00F8F57C /* LocationsAdd */,
46C3B7CC29E5CFBB00F8F57C /* LocationsList */,
); );
path = Screens; path = Screens;
sourceTree = "<group>"; sourceTree = "<group>";
@ -176,7 +214,6 @@
children = ( children = (
46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */, 46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */,
46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */, 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */,
46C3B7DA29E5E80B00F8F57C /* Protocols */,
); );
path = LocationsList; path = LocationsList;
sourceTree = "<group>"; sourceTree = "<group>";
@ -190,23 +227,6 @@
path = LocationsAdd; path = LocationsAdd;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
46C3B7D929E5E7F900F8F57C /* Protocols */ = {
isa = PBXGroup;
children = (
46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */,
46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordinable.swift */,
);
path = Protocols;
sourceTree = "<group>";
};
46C3B7DA29E5E80B00F8F57C /* Protocols */ = {
isa = PBXGroup;
children = (
46C3B7D529E5E50500F8F57C /* LocationsListViewModelable.swift */,
);
path = Protocols;
sourceTree = "<group>";
};
46EB325029E1BBD1001D5EAF = { 46EB325029E1BBD1001D5EAF = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -268,9 +288,11 @@
46EB332F29E1CE1E001D5EAF /* Sources */ = { 46EB332F29E1CE1E001D5EAF /* Sources */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
46C3B7C929E5CB8F00F8F57C /* Screens */,
46C3B7C429E5BEE900F8F57C /* Coordinators */,
46EB331A29E1CE04001D5EAF /* AppDelegate.swift */, 46EB331A29E1CE04001D5EAF /* AppDelegate.swift */,
0276C96029E5F5DC000B62AF /* Protocols */,
46C3B7C429E5BEE900F8F57C /* Coordinators */,
46C3B7C929E5CB8F00F8F57C /* Screens */,
02031EC429E5FEB1003C108C /* View Controllers */,
); );
path = Sources; path = Sources;
sourceTree = "<group>"; sourceTree = "<group>";
@ -478,11 +500,13 @@
files = ( files = (
46C3B7C629E5BF1500F8F57C /* LocationsListCoordinator.swift in Sources */, 46C3B7C629E5BF1500F8F57C /* LocationsListCoordinator.swift in Sources */,
46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */, 46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */,
02031EC629E5FEE4003C108C /* BaseViewController.swift in Sources */,
46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */, 46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */,
02031EBF29E5F949003C108C /* LocationsAddViewModeling.swift in Sources */,
46C3B7DE29E5ED2E00F8F57C /* LocationsAddCoordinator.swift in Sources */, 46C3B7DE29E5ED2E00F8F57C /* LocationsAddCoordinator.swift in Sources */,
46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordinable.swift in Sources */, 46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordination.swift in Sources */,
46C3B7D829E5E55000F8F57C /* LocationsListCoordinable.swift in Sources */, 46C3B7D829E5E55000F8F57C /* LocationsListCoordination.swift in Sources */,
46C3B7D629E5E50500F8F57C /* LocationsListViewModelable.swift in Sources */, 46C3B7D629E5E50500F8F57C /* LocationsListViewModeling.swift in Sources */,
46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */, 46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */,
46C3B7D129E5D06D00F8F57C /* LocationsAddViewController.swift in Sources */, 46C3B7D129E5D06D00F8F57C /* LocationsAddViewController.swift in Sources */,
46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */, 46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */,