├── .github └── FUNDING.yml ├── MVVM ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Model │ ├── Authentication.swift │ ├── SignInResponse.swift │ └── SessionService.swift ├── AppDelegate.swift ├── ViewModel │ └── SignInViewModel.swift ├── Info.plist ├── View │ ├── SignInViewController.swift │ └── Base.lproj │ │ └── Main.storyboard └── Base.lproj │ └── LaunchScreen.storyboard ├── MVVM+Coordinator ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Model │ ├── Authentication.swift │ ├── SignInResponse.swift │ └── SessionService.swift ├── AppDelegate.swift ├── ViewModel │ └── SignInViewModel.swift ├── View │ ├── SignInViewController.swift │ └── Main.storyboard ├── Info.plist ├── Base.lproj │ └── LaunchScreen.storyboard └── Coordinator │ └── AppCoordinator.swift ├── MVVM+RxSwift ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Model │ ├── Authentication.swift │ ├── SignInResponse.swift │ └── SessionService.swift ├── AppDelegate.swift ├── ViewModel │ └── SignInViewModel.swift ├── Info.plist ├── Base.lproj │ └── LaunchScreen.storyboard └── View │ ├── SignInViewController.swift │ └── Base.lproj │ └── Main.storyboard ├── MVVM+ChildCoordinators ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Model │ ├── Authentication.swift │ ├── SignInResponse.swift │ └── SessionService.swift ├── AppDelegate.swift ├── Coordinator │ ├── AppCoordinator.swift │ ├── BaseCoordinator.swift │ └── SignInCoordinator.swift ├── ViewModel │ └── SignInViewModel.swift ├── View │ ├── SignInViewController.swift │ └── Main.storyboard ├── Info.plist └── Base.lproj │ └── LaunchScreen.storyboard ├── MVVMC.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── xcshareddata │ └── xcschemes │ │ ├── MVVM.xcscheme │ │ └── MVVM+RxSwift.xcscheme └── project.pbxproj ├── MVVMC.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── AlertExtension.swift ├── README.md ├── Podfile ├── LICENSE └── .gitignore /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: wojciech-kulik 2 | -------------------------------------------------------------------------------- /MVVM/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /MVVM+Coordinator/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /MVVM+RxSwift/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /MVVM/Model/Authentication.swift: -------------------------------------------------------------------------------- 1 | protocol Authentication { 2 | func signIn(completion: (SignInResponse) -> Void) 3 | } 4 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /MVVM+RxSwift/Model/Authentication.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | protocol Authentication { 4 | func signIn() -> Single 5 | } 6 | -------------------------------------------------------------------------------- /MVVM+Coordinator/Model/Authentication.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | protocol Authentication { 4 | func signIn() -> Single 5 | } 6 | -------------------------------------------------------------------------------- /MVVM/Model/SignInResponse.swift: -------------------------------------------------------------------------------- 1 | enum SignInResponse { 2 | case success(token: String, userId: String) 3 | case error(message: String) 4 | } 5 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/Model/Authentication.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | protocol Authentication { 4 | func signIn() -> Single 5 | } 6 | -------------------------------------------------------------------------------- /MVVM+Coordinator/Model/SignInResponse.swift: -------------------------------------------------------------------------------- 1 | enum SignInResponse { 2 | case success(token: String, userId: String) 3 | case error(message: String) 4 | } 5 | -------------------------------------------------------------------------------- /MVVM+RxSwift/Model/SignInResponse.swift: -------------------------------------------------------------------------------- 1 | enum SignInResponse { 2 | case success(token: String, userId: String) 3 | case error(message: String) 4 | } 5 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/Model/SignInResponse.swift: -------------------------------------------------------------------------------- 1 | enum SignInResponse { 2 | case success(token: String, userId: String) 3 | case error(message: String) 4 | } 5 | -------------------------------------------------------------------------------- /MVVMC.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /MVVM/Model/SessionService.swift: -------------------------------------------------------------------------------- 1 | class SessionService: Authentication { 2 | func signIn(completion: (SignInResponse) -> Void) { 3 | // call to backend 4 | completion(.success(token: "12345", userId: "5678")) 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /MVVMC.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /MVVMC.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /MVVMC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /MVVM+RxSwift/Model/SessionService.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | class SessionService: Authentication { 4 | func signIn() -> Single { 5 | return Single.create { single in 6 | // call to backend 7 | single(.success(SignInResponse.success(token: "12345", userId: "5678"))) 8 | return Disposables.create() 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /MVVM+Coordinator/Model/SessionService.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | class SessionService: Authentication { 4 | func signIn() -> Single { 5 | return Single.create { single in 6 | // call to backend 7 | single(.success(SignInResponse.success(token: "12345", userId: "5678"))) 8 | return Disposables.create() 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/Model/SessionService.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | class SessionService: Authentication { 4 | func signIn() -> Single { 5 | return Single.create { single in 6 | // call to backend 7 | single(.success(SignInResponse.success(token: "12345", userId: "5678"))) 8 | return Disposables.create() 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /MVVM/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | @UIApplicationMain 4 | class AppDelegate: UIResponder, UIApplicationDelegate { 5 | 6 | var window: UIWindow? 7 | 8 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 9 | // Override point for customization after application launch. 10 | return true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /MVVM+RxSwift/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | @UIApplicationMain 4 | class AppDelegate: UIResponder, UIApplicationDelegate { 5 | 6 | var window: UIWindow? 7 | 8 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 9 | // Override point for customization after application launch. 10 | return true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /AlertExtension.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | extension UIViewController { 5 | 6 | func showAlert(title: String, message: String) { 7 | let viewController = UIAlertController(title: title, message: message, preferredStyle: .alert) 8 | viewController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 9 | self.present(viewController, animated: true, completion: nil) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /MVVM+Coordinator/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | @UIApplicationMain 4 | class AppDelegate: UIResponder, UIApplicationDelegate { 5 | 6 | var window: UIWindow? 7 | let appCoordinator = AppCoordinator() 8 | 9 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 10 | self.appCoordinator.start() 11 | return true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | @UIApplicationMain 4 | class AppDelegate: UIResponder, UIApplicationDelegate { 5 | 6 | var window: UIWindow? 7 | let appCoordinator = AppCoordinator() 8 | 9 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 10 | self.appCoordinator.start() 11 | return true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![BuyMeACoffee](https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg)](https://www.buymeacoffee.com/WojciechKulik) 2 | 3 | ## Swift-MVVMC-SimpleExample 4 | This repository contains code samples from this article: 5 | [MVVM + Coordinators + RxSwift based on sample iOS application with authentication](https://wojciechkulik.pl/ios/mvvm-coordinators-rxswift-and-sample-ios-application-with-authentication) 6 | 7 | For more advanced example please check out this repository: 8 | [Swift-MVVMC-Demo](https://github.com/wojciech-kulik/Swift-MVVMC-Demo) 9 | 10 | ## Compilation 11 | Project uses [CocoaPods](https://guides.cocoapods.org/using/getting-started.html) for dependencies: 12 | 13 | sudo gem install cocoapods 14 | pod install 15 | 16 | Use `MVVMC.xcworkspace` to open project. 17 | 18 | You can also check out my another demo with Redux architecture: 19 | - https://github.com/wojciech-kulik/ReSwiftDemo 20 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'MVVM' do 5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 6 | use_frameworks! 7 | # Pods for MVVM 8 | 9 | end 10 | 11 | target 'MVVM+ChildCoordinators' do 12 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 13 | use_frameworks! 14 | pod 'RxSwift' 15 | pod 'RxCocoa' 16 | # Pods for MVVM+ChildCoordinators 17 | 18 | end 19 | 20 | target 'MVVM+Coordinator' do 21 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 22 | use_frameworks! 23 | pod 'RxSwift' 24 | pod 'RxCocoa' 25 | # Pods for MVVM+Coordinator 26 | 27 | end 28 | 29 | target 'MVVM+RxSwift' do 30 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 31 | use_frameworks! 32 | pod 'RxSwift' 33 | pod 'RxCocoa' 34 | # Pods for MVVM+RxSwift 35 | 36 | end 37 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/Coordinator/AppCoordinator.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | import RxSwift 4 | 5 | protocol SignInListener { 6 | func didSignIn() 7 | } 8 | 9 | class AppCoordinator: BaseCoordinator { 10 | 11 | var window = UIWindow(frame: UIScreen.main.bounds) 12 | 13 | override func start() { 14 | self.navigationController.navigationBar.isHidden = true 15 | self.window.rootViewController = self.navigationController 16 | self.window.makeKeyAndVisible() 17 | 18 | // TODO: here you could check if user is signed in and show appropriate screen 19 | let coordinator = SignInCoordinator() 20 | coordinator.navigationController = self.navigationController 21 | self.start(coordinator: coordinator) 22 | } 23 | } 24 | 25 | extension AppCoordinator: SignInListener { 26 | func didSignIn() { 27 | self.navigationController.showAlert(title: "Success", message: "Signed in") 28 | // TODO: Navigate to Dashboard 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /MVVM/ViewModel/SignInViewModel.swift: -------------------------------------------------------------------------------- 1 | protocol SignInDelegate: AnyObject { 2 | func didSignIn() 3 | func didFailSignIn(message: String) 4 | } 5 | 6 | class SignInViewModel { 7 | 8 | private let authentication: Authentication 9 | weak var delegate: SignInDelegate? 10 | 11 | var emailAddress = "" 12 | var password = "" 13 | var isSignInActive: Bool { 14 | // business logic like validation could be extracted to model 15 | return self.emailAddress != "" && self.password != "" 16 | } 17 | 18 | init(authentication: Authentication) { 19 | self.authentication = authentication 20 | } 21 | 22 | func signInTapped() { 23 | self.authentication.signIn { [weak self] response in 24 | guard let delegate = self?.delegate else { return } 25 | 26 | if case .success(_) = response { 27 | delegate.didSignIn() 28 | } else if case .error(let message) = response { 29 | delegate.didFailSignIn(message: message) 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/Coordinator/BaseCoordinator.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | protocol Coordinator: AnyObject { 4 | var navigationController: UINavigationController { get set } 5 | var parentCoordinator: Coordinator? { get set } 6 | 7 | func start() 8 | func start(coordinator: Coordinator) 9 | func didFinish(coordinator: Coordinator) 10 | } 11 | 12 | class BaseCoordinator: Coordinator { 13 | 14 | var childCoordinators: [Coordinator] = [] 15 | var parentCoordinator: Coordinator? 16 | var navigationController = UINavigationController() 17 | 18 | func start() { 19 | fatalError("Start method must be implemented") 20 | } 21 | 22 | func start(coordinator: Coordinator) { 23 | self.childCoordinators.append(coordinator) 24 | coordinator.parentCoordinator = self 25 | coordinator.start() 26 | } 27 | 28 | func didFinish(coordinator: Coordinator) { 29 | if let index = self.childCoordinators.firstIndex(where: { $0 === coordinator }) { 30 | self.childCoordinators.remove(at: index) 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Wojciech Kulik 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MVVM+RxSwift/ViewModel/SignInViewModel.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | class SignInViewModel { 4 | 5 | private let disposeBag = DisposeBag() 6 | private let authentication: Authentication 7 | 8 | let emailAddress = BehaviorSubject(value: "") 9 | let password = BehaviorSubject(value: "") 10 | let isSignInActive: Observable 11 | 12 | // events 13 | let didSignIn = PublishSubject() 14 | let didFailSignIn = PublishSubject() 15 | 16 | init(authentication: Authentication) { 17 | self.authentication = authentication 18 | self.isSignInActive = Observable.combineLatest(self.emailAddress, self.password).map { $0.0 != "" && $0.1 != "" } 19 | } 20 | 21 | func signInTapped() { 22 | self.authentication.signIn() 23 | .map { _ in } 24 | .observeOn(MainScheduler.instance) 25 | .subscribe(onSuccess: { [weak self] _ in 26 | self?.didSignIn.onNext(()) 27 | }, onError: { [weak self] error in 28 | self?.didFailSignIn.onNext(error) 29 | }) 30 | .disposed(by: self.disposeBag) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /MVVM+Coordinator/ViewModel/SignInViewModel.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | class SignInViewModel { 4 | 5 | private let disposeBag = DisposeBag() 6 | private let authentication: Authentication 7 | 8 | let emailAddress = BehaviorSubject(value: "") 9 | let password = BehaviorSubject(value: "") 10 | let isSignInActive: Observable 11 | 12 | // events 13 | let didSignIn = PublishSubject() 14 | let didFailSignIn = PublishSubject() 15 | 16 | init(authentication: Authentication) { 17 | self.authentication = authentication 18 | self.isSignInActive = Observable.combineLatest(self.emailAddress, self.password).map { $0.0 != "" && $0.1 != "" } 19 | } 20 | 21 | func signInTapped() { 22 | self.authentication.signIn() 23 | .map { _ in } 24 | .observeOn(MainScheduler.instance) 25 | .subscribe(onSuccess: { [weak self] _ in 26 | self?.didSignIn.onNext(()) 27 | }, onError: { [weak self] error in 28 | self?.didFailSignIn.onNext(error) 29 | }) 30 | .disposed(by: self.disposeBag) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/ViewModel/SignInViewModel.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | class SignInViewModel { 4 | 5 | private let disposeBag = DisposeBag() 6 | private let authentication: Authentication 7 | 8 | let emailAddress = BehaviorSubject(value: "") 9 | let password = BehaviorSubject(value: "") 10 | let isSignInActive: Observable 11 | 12 | // events 13 | let didSignIn = PublishSubject() 14 | let didFailSignIn = PublishSubject() 15 | 16 | init(authentication: Authentication) { 17 | self.authentication = authentication 18 | self.isSignInActive = Observable.combineLatest(self.emailAddress, self.password).map { $0.0 != "" && $0.1 != "" } 19 | } 20 | 21 | func signInTapped() { 22 | self.authentication.signIn() 23 | .map { _ in } 24 | .observeOn(MainScheduler.instance) 25 | .subscribe(onSuccess: { [weak self] _ in 26 | self?.didSignIn.onNext(()) 27 | }, onError: { [weak self] error in 28 | self?.didFailSignIn.onNext(error) 29 | }) 30 | .disposed(by: self.disposeBag) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/Coordinator/SignInCoordinator.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | class SignInCoordinator: BaseCoordinator { 4 | 5 | private let disposeBag = DisposeBag() 6 | 7 | override func start() { 8 | let viewController = UIStoryboard.init(name: "Main", bundle: nil).instantiateInitialViewController() 9 | guard let signInViewController = viewController as? SignInViewController else { return } 10 | 11 | // Now Coordinator initializes and injects viewModel 12 | let signInViewModel = SignInViewModel(authentication: SessionService()) 13 | signInViewController.viewModel = signInViewModel 14 | 15 | // Coordinator subscribes to events and notifies parentCoordinator 16 | signInViewModel.didSignIn 17 | .subscribe(onNext: { [weak self] in 18 | guard let `self` = self else { return } 19 | self.navigationController.viewControllers = [] 20 | self.parentCoordinator?.didFinish(coordinator: self) 21 | (self.parentCoordinator as? SignInListener)?.didSignIn() 22 | }) 23 | .disposed(by: self.disposeBag) 24 | 25 | self.navigationController.viewControllers = [signInViewController] 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /MVVM+Coordinator/View/SignInViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import RxSwift 3 | import RxCocoa 4 | 5 | class SignInViewController: UIViewController { 6 | 7 | @IBOutlet weak var emailTextField: UITextField! 8 | @IBOutlet weak var passwordTextField: UITextField! 9 | @IBOutlet weak var signInButton: UIButton! 10 | 11 | private let disposeBag = DisposeBag() 12 | var viewModel: SignInViewModel? 13 | 14 | override func viewDidLoad() { 15 | self.setUpBindings() 16 | super.viewDidLoad() 17 | } 18 | 19 | private func setUpBindings() { 20 | guard let viewModel = viewModel else { return } 21 | 22 | self.emailTextField.rx.text.orEmpty 23 | .bind(to: viewModel.emailAddress) 24 | .disposed(by: self.disposeBag) 25 | 26 | self.passwordTextField.rx.text.orEmpty 27 | .bind(to: viewModel.password) 28 | .disposed(by: self.disposeBag) 29 | 30 | self.signInButton.rx.tap 31 | .bind { viewModel.signInTapped() } 32 | .disposed(by: self.disposeBag) 33 | 34 | viewModel.isSignInActive 35 | .bind(to: self.signInButton.rx.isEnabled) 36 | .disposed(by: self.disposeBag) 37 | 38 | viewModel.didFailSignIn 39 | .subscribe(onNext: { error in 40 | print("Failed: \(error)") 41 | }) 42 | .disposed(by: self.disposeBag) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/View/SignInViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import RxSwift 3 | import RxCocoa 4 | 5 | class SignInViewController: UIViewController { 6 | 7 | @IBOutlet weak var emailTextField: UITextField! 8 | @IBOutlet weak var passwordTextField: UITextField! 9 | @IBOutlet weak var signInButton: UIButton! 10 | 11 | private let disposeBag = DisposeBag() 12 | var viewModel: SignInViewModel? 13 | 14 | override func viewDidLoad() { 15 | self.setUpBindings() 16 | super.viewDidLoad() 17 | } 18 | 19 | private func setUpBindings() { 20 | guard let viewModel = viewModel else { return } 21 | 22 | self.emailTextField.rx.text.orEmpty 23 | .bind(to: viewModel.emailAddress) 24 | .disposed(by: self.disposeBag) 25 | 26 | self.passwordTextField.rx.text.orEmpty 27 | .bind(to: viewModel.password) 28 | .disposed(by: self.disposeBag) 29 | 30 | self.signInButton.rx.tap 31 | .bind { viewModel.signInTapped() } 32 | .disposed(by: self.disposeBag) 33 | 34 | viewModel.isSignInActive 35 | .bind(to: self.signInButton.rx.isEnabled) 36 | .disposed(by: self.disposeBag) 37 | 38 | viewModel.didFailSignIn 39 | .subscribe(onNext: { error in 40 | print("Failed: \(error)") 41 | }) 42 | .disposed(by: self.disposeBag) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /MVVM+Coordinator/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIRequiredDeviceCapabilities 26 | 27 | armv7 28 | 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIRequiredDeviceCapabilities 26 | 27 | armv7 28 | 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /MVVM/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /MVVM+RxSwift/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /MVVM/View/SignInViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | 4 | class SignInViewController: UIViewController { 5 | 6 | @IBOutlet weak var emailTextField: UITextField! 7 | @IBOutlet weak var passwordTextField: UITextField! 8 | @IBOutlet weak var signInButton: UIButton! 9 | 10 | private var viewModel: SignInViewModel! 11 | 12 | override func viewDidLoad() { 13 | self.viewModel = SignInViewModel(authentication: SessionService()) 14 | self.viewModel.delegate = self 15 | self.setUpBindings() 16 | super.viewDidLoad() 17 | } 18 | 19 | private func setUpBindings() { 20 | self.emailTextField.addTarget(self, action: #selector(self.credentialsChanged), for: UIControl.Event.editingChanged) 21 | self.passwordTextField.addTarget(self, action: #selector(self.credentialsChanged), for: UIControl.Event.editingChanged) 22 | self.signInButton.isEnabled = self.viewModel.isSignInActive 23 | } 24 | 25 | @objc private func credentialsChanged() { 26 | self.viewModel.emailAddress = self.emailTextField.text ?? "" 27 | self.viewModel.password = self.passwordTextField.text ?? "" 28 | self.signInButton.isEnabled = self.viewModel.isSignInActive 29 | } 30 | 31 | @IBAction func signInTapped() { 32 | self.viewModel.signInTapped() 33 | } 34 | } 35 | 36 | extension SignInViewController: SignInDelegate { 37 | 38 | func didSignIn() { 39 | self.showAlert(title: "Success", message: "Signed In") 40 | // do smth 41 | } 42 | 43 | func didFailSignIn(message: String) { 44 | print("Failed: \(message)") 45 | // do smth 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /MVVM/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /MVVM+RxSwift/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /MVVM+Coordinator/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | # Package.resolved 41 | .build/ 42 | 43 | # CocoaPods 44 | # 45 | # We recommend against adding the Pods directory to your .gitignore. However 46 | # you should judge for yourself, the pros and cons are mentioned at: 47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 48 | # 49 | Pods/ 50 | Podfile.lock 51 | 52 | # Carthage 53 | # 54 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 55 | # Carthage/Checkouts 56 | 57 | Carthage/Build 58 | 59 | # fastlane 60 | # 61 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 62 | # screenshots whenever they are needed. 63 | # For more information about the recommended setup visit: 64 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 65 | 66 | fastlane/report.xml 67 | fastlane/Preview.html 68 | fastlane/screenshots/**/*.png 69 | fastlane/test_output 70 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /MVVM+Coordinator/Coordinator/AppCoordinator.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | import RxSwift 4 | 5 | protocol Coordinator { 6 | var navigationController: UINavigationController { get set } 7 | func start() 8 | } 9 | 10 | class AppCoordinator: Coordinator { 11 | private let disposeBag = DisposeBag() 12 | private var window = UIWindow(frame: UIScreen.main.bounds) 13 | 14 | var navigationController = UINavigationController() 15 | 16 | func start() { 17 | self.navigationController.navigationBar.isHidden = true 18 | self.window.rootViewController = self.navigationController 19 | self.window.makeKeyAndVisible() 20 | 21 | // TODO: here you could check if user is signed in and show appropriate screen 22 | self.showSignIn() 23 | } 24 | 25 | func showSignIn() { 26 | let viewController = UIStoryboard.init(name: "Main", bundle: nil).instantiateInitialViewController() 27 | guard let signInViewController = viewController as? SignInViewController else { return } 28 | 29 | // Coordinator initializes and injects viewModel 30 | let signInViewModel = SignInViewModel(authentication: SessionService()) 31 | signInViewController.viewModel = signInViewModel 32 | 33 | // Coordinator subscribes to events and decides when and how to navigate 34 | signInViewModel.didSignIn 35 | .subscribe(onNext: { [weak signInViewController] in 36 | // Navigate to dashboard 37 | signInViewController?.showAlert(title: "Success", message: "Signed in") 38 | }) 39 | .disposed(by: self.disposeBag) 40 | 41 | self.navigationController.viewControllers = [signInViewController] 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /MVVM+RxSwift/View/SignInViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import RxSwift 3 | import RxCocoa 4 | 5 | class SignInViewController: UIViewController { 6 | 7 | @IBOutlet weak var emailTextField: UITextField! 8 | @IBOutlet weak var passwordTextField: UITextField! 9 | @IBOutlet weak var signInButton: UIButton! 10 | 11 | private let disposeBag = DisposeBag() 12 | private var viewModel: SignInViewModel! 13 | 14 | override func viewDidLoad() { 15 | self.viewModel = SignInViewModel(authentication: SessionService()) 16 | self.setUpBindings() 17 | super.viewDidLoad() 18 | } 19 | 20 | private func setUpBindings() { 21 | self.emailTextField.rx.text.orEmpty 22 | .bind(to: self.viewModel.emailAddress) 23 | .disposed(by: self.disposeBag) 24 | 25 | self.passwordTextField.rx.text.orEmpty 26 | .bind(to: self.viewModel.password) 27 | .disposed(by: self.disposeBag) 28 | 29 | self.signInButton.rx.tap 30 | .bind { [weak self] in self?.viewModel.signInTapped() } 31 | .disposed(by: self.disposeBag) 32 | 33 | self.viewModel.isSignInActive 34 | .bind(to: self.signInButton.rx.isEnabled) 35 | .disposed(by: self.disposeBag) 36 | 37 | self.viewModel.didSignIn 38 | .subscribe(onNext: { [weak self] in 39 | self?.showAlert(title: "Success", message: "Signed in") 40 | // do smth 41 | }) 42 | .disposed(by: self.disposeBag) 43 | 44 | self.viewModel.didFailSignIn 45 | .subscribe(onNext: { error in 46 | print("Failed: \(error)") 47 | // do smth 48 | }) 49 | .disposed(by: self.disposeBag) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /MVVM/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /MVVM+RxSwift/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /MVVM+Coordinator/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /MVVMC.xcodeproj/xcshareddata/xcschemes/MVVM.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /MVVMC.xcodeproj/xcshareddata/xcschemes/MVVM+RxSwift.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /MVVM+Coordinator/View/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /MVVM+ChildCoordinators/View/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /MVVM+RxSwift/View/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /MVVM/View/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /MVVMC.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 11C76D2A707CB56E78B2A33F /* Pods_MVVM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F64D37C72D13DA21C670CCC /* Pods_MVVM.framework */; }; 11 | 1621EB77B3B5461946096A7A /* Pods_MVVM_ChildCoordinators.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EFCCC9DC56F1C03E41441CF /* Pods_MVVM_ChildCoordinators.framework */; }; 12 | 168447BB22E314E400454D5E /* SignInResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447B122E314E400454D5E /* SignInResponse.swift */; }; 13 | 168447BC22E314E400454D5E /* Authentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447B222E314E400454D5E /* Authentication.swift */; }; 14 | 168447BD22E314E400454D5E /* SessionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447B322E314E400454D5E /* SessionService.swift */; }; 15 | 168447BE22E314E400454D5E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 168447B522E314E400454D5E /* Main.storyboard */; }; 16 | 168447BF22E314E400454D5E /* SignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447B722E314E400454D5E /* SignInViewController.swift */; }; 17 | 168447C122E314E400454D5E /* SignInViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447BA22E314E400454D5E /* SignInViewModel.swift */; }; 18 | 168447C322E3150D00454D5E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447C222E3150D00454D5E /* AppDelegate.swift */; }; 19 | 168447E322E316FF00454D5E /* SignInViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447DB22E316FF00454D5E /* SignInViewModel.swift */; }; 20 | 168447E422E316FF00454D5E /* SignInResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447DD22E316FF00454D5E /* SignInResponse.swift */; }; 21 | 168447E522E316FF00454D5E /* Authentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447DE22E316FF00454D5E /* Authentication.swift */; }; 22 | 168447E622E316FF00454D5E /* SessionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447DF22E316FF00454D5E /* SessionService.swift */; }; 23 | 168447E722E316FF00454D5E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447E022E316FF00454D5E /* AppDelegate.swift */; }; 24 | 168447EA22E3176200454D5E /* AppCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447E922E3176200454D5E /* AppCoordinator.swift */; }; 25 | 168447F522E317CE00454D5E /* SignInResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447EC22E317CE00454D5E /* SignInResponse.swift */; }; 26 | 168447F622E317CE00454D5E /* Authentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447ED22E317CE00454D5E /* Authentication.swift */; }; 27 | 168447F722E317CE00454D5E /* SessionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447EE22E317CE00454D5E /* SessionService.swift */; }; 28 | 168447F822E317CE00454D5E /* SignInViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447F022E317CE00454D5E /* SignInViewModel.swift */; }; 29 | 168447F922E317CE00454D5E /* AppCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447F222E317CE00454D5E /* AppCoordinator.swift */; }; 30 | 168447FA22E317CE00454D5E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447F322E317CE00454D5E /* AppDelegate.swift */; }; 31 | 168447FC22E317E900454D5E /* BaseCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447FB22E317E900454D5E /* BaseCoordinator.swift */; }; 32 | 168447FE22E3182F00454D5E /* SignInCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168447FD22E3182F00454D5E /* SignInCoordinator.swift */; }; 33 | 16AA442A22E3198300FD9A66 /* SignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16AA442822E3198300FD9A66 /* SignInViewController.swift */; }; 34 | 16AA442B22E3198300FD9A66 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 16AA442922E3198300FD9A66 /* Main.storyboard */; }; 35 | 16AA442E22E319F900FD9A66 /* SignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16AA442C22E319F800FD9A66 /* SignInViewController.swift */; }; 36 | 16AA442F22E319F900FD9A66 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 16AA442D22E319F800FD9A66 /* Main.storyboard */; }; 37 | 16D7B9A322E3134C007475CC /* SignInResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16D7B9A222E3134C007475CC /* SignInResponse.swift */; }; 38 | 16D7B9A522E31367007475CC /* Authentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16D7B9A422E31367007475CC /* Authentication.swift */; }; 39 | 16EA3B8822E30F2500B18097 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 16EA3B8722E30F2500B18097 /* Assets.xcassets */; }; 40 | 16EA3B8B22E30F2500B18097 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 16EA3B8922E30F2500B18097 /* LaunchScreen.storyboard */; }; 41 | 16EA3B9722E30F3C00B18097 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16EA3B9622E30F3C00B18097 /* AppDelegate.swift */; }; 42 | 16EA3B9922E30F3C00B18097 /* SessionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16EA3B9822E30F3C00B18097 /* SessionService.swift */; }; 43 | 16EA3B9C22E30F3D00B18097 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 16EA3B9A22E30F3D00B18097 /* Main.storyboard */; }; 44 | 16EA3B9E22E30F3D00B18097 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 16EA3B9D22E30F3D00B18097 /* Assets.xcassets */; }; 45 | 16EA3BA122E30F3D00B18097 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 16EA3B9F22E30F3D00B18097 /* LaunchScreen.storyboard */; }; 46 | 16EA3BB422E30F5B00B18097 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 16EA3BB322E30F5B00B18097 /* Assets.xcassets */; }; 47 | 16EA3BB722E30F5B00B18097 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 16EA3BB522E30F5B00B18097 /* LaunchScreen.storyboard */; }; 48 | 16EA3BCA22E30F6400B18097 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 16EA3BC922E30F6400B18097 /* Assets.xcassets */; }; 49 | 16EA3BCD22E30F6400B18097 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 16EA3BCB22E30F6400B18097 /* LaunchScreen.storyboard */; }; 50 | 16EA3BD322E30FFD00B18097 /* SignInViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16EA3BD222E30FFD00B18097 /* SignInViewModel.swift */; }; 51 | 16EA3BD522E3101D00B18097 /* SignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16EA3BD422E3101D00B18097 /* SignInViewController.swift */; }; 52 | 16EA3BD722E310FD00B18097 /* AlertExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16EA3BD622E310FD00B18097 /* AlertExtension.swift */; }; 53 | 16EA3BD822E3115400B18097 /* AlertExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16EA3BD622E310FD00B18097 /* AlertExtension.swift */; }; 54 | 16EA3BD922E3115400B18097 /* AlertExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16EA3BD622E310FD00B18097 /* AlertExtension.swift */; }; 55 | 16EA3BDA22E3115400B18097 /* AlertExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16EA3BD622E310FD00B18097 /* AlertExtension.swift */; }; 56 | 5BAC5BD86C94458ED7065D6D /* Pods_MVVM_RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B4D5043EF9A8AEB08804B050 /* Pods_MVVM_RxSwift.framework */; }; 57 | A4458795E115078FEF19CB98 /* Pods_MVVM_Coordinator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A811D6B820D8C3B37C8FAC9 /* Pods_MVVM_Coordinator.framework */; }; 58 | /* End PBXBuildFile section */ 59 | 60 | /* Begin PBXFileReference section */ 61 | 0EB23E3F3B58FD4072492954 /* Pods-MVVM+ChildCoordinators.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MVVM+ChildCoordinators.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MVVM+ChildCoordinators/Pods-MVVM+ChildCoordinators.debug.xcconfig"; sourceTree = ""; }; 62 | 168447B122E314E400454D5E /* SignInResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInResponse.swift; sourceTree = ""; }; 63 | 168447B222E314E400454D5E /* Authentication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Authentication.swift; sourceTree = ""; }; 64 | 168447B322E314E400454D5E /* SessionService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionService.swift; sourceTree = ""; }; 65 | 168447B622E314E400454D5E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 66 | 168447B722E314E400454D5E /* SignInViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInViewController.swift; sourceTree = ""; }; 67 | 168447BA22E314E400454D5E /* SignInViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInViewModel.swift; sourceTree = ""; }; 68 | 168447C222E3150D00454D5E /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 69 | 168447DB22E316FF00454D5E /* SignInViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInViewModel.swift; sourceTree = ""; }; 70 | 168447DD22E316FF00454D5E /* SignInResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInResponse.swift; sourceTree = ""; }; 71 | 168447DE22E316FF00454D5E /* Authentication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Authentication.swift; sourceTree = ""; }; 72 | 168447DF22E316FF00454D5E /* SessionService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionService.swift; sourceTree = ""; }; 73 | 168447E022E316FF00454D5E /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 74 | 168447E922E3176200454D5E /* AppCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppCoordinator.swift; sourceTree = ""; }; 75 | 168447EC22E317CE00454D5E /* SignInResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInResponse.swift; sourceTree = ""; }; 76 | 168447ED22E317CE00454D5E /* Authentication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Authentication.swift; sourceTree = ""; }; 77 | 168447EE22E317CE00454D5E /* SessionService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionService.swift; sourceTree = ""; }; 78 | 168447F022E317CE00454D5E /* SignInViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInViewModel.swift; sourceTree = ""; }; 79 | 168447F222E317CE00454D5E /* AppCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppCoordinator.swift; sourceTree = ""; }; 80 | 168447F322E317CE00454D5E /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 81 | 168447FB22E317E900454D5E /* BaseCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseCoordinator.swift; sourceTree = ""; }; 82 | 168447FD22E3182F00454D5E /* SignInCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInCoordinator.swift; sourceTree = ""; }; 83 | 16AA442822E3198300FD9A66 /* SignInViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInViewController.swift; sourceTree = ""; }; 84 | 16AA442922E3198300FD9A66 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 85 | 16AA442C22E319F800FD9A66 /* SignInViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInViewController.swift; sourceTree = ""; }; 86 | 16AA442D22E319F800FD9A66 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 87 | 16D7B9A222E3134C007475CC /* SignInResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInResponse.swift; sourceTree = ""; }; 88 | 16D7B9A422E31367007475CC /* Authentication.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Authentication.swift; sourceTree = ""; }; 89 | 16EA3B7E22E30F2400B18097 /* MVVM+RxSwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "MVVM+RxSwift.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 90 | 16EA3B8722E30F2500B18097 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 91 | 16EA3B8A22E30F2500B18097 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 92 | 16EA3B8C22E30F2500B18097 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 93 | 16EA3B9422E30F3C00B18097 /* MVVM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MVVM.app; sourceTree = BUILT_PRODUCTS_DIR; }; 94 | 16EA3B9622E30F3C00B18097 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 95 | 16EA3B9822E30F3C00B18097 /* SessionService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionService.swift; sourceTree = ""; }; 96 | 16EA3B9B22E30F3D00B18097 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97 | 16EA3B9D22E30F3D00B18097 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 98 | 16EA3BA022E30F3D00B18097 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 99 | 16EA3BA222E30F3D00B18097 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 100 | 16EA3BAA22E30F5A00B18097 /* MVVM+Coordinator.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "MVVM+Coordinator.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 101 | 16EA3BB322E30F5B00B18097 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 102 | 16EA3BB622E30F5B00B18097 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 103 | 16EA3BB822E30F5B00B18097 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 104 | 16EA3BC022E30F6300B18097 /* MVVM+ChildCoordinators.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "MVVM+ChildCoordinators.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 105 | 16EA3BC922E30F6400B18097 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 106 | 16EA3BCC22E30F6400B18097 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 107 | 16EA3BCE22E30F6400B18097 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 108 | 16EA3BD222E30FFD00B18097 /* SignInViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInViewModel.swift; sourceTree = ""; }; 109 | 16EA3BD422E3101D00B18097 /* SignInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInViewController.swift; sourceTree = ""; }; 110 | 16EA3BD622E310FD00B18097 /* AlertExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertExtension.swift; sourceTree = ""; }; 111 | 259A9A0E7B3148E97811DB5C /* Pods-MVVM+RxSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MVVM+RxSwift.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MVVM+RxSwift/Pods-MVVM+RxSwift.debug.xcconfig"; sourceTree = ""; }; 112 | 2C344EAC4B086535E24C7D34 /* Pods-MVVM+Coordinator.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MVVM+Coordinator.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MVVM+Coordinator/Pods-MVVM+Coordinator.debug.xcconfig"; sourceTree = ""; }; 113 | 4A811D6B820D8C3B37C8FAC9 /* Pods_MVVM_Coordinator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MVVM_Coordinator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 114 | 4AB7F2E38440089DF849B8F7 /* Pods-MVVM.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MVVM.release.xcconfig"; path = "Pods/Target Support Files/Pods-MVVM/Pods-MVVM.release.xcconfig"; sourceTree = ""; }; 115 | 956F0E67F7539659D79ACB1A /* Pods-MVVM+RxSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MVVM+RxSwift.release.xcconfig"; path = "Pods/Target Support Files/Pods-MVVM+RxSwift/Pods-MVVM+RxSwift.release.xcconfig"; sourceTree = ""; }; 116 | 9EFCCC9DC56F1C03E41441CF /* Pods_MVVM_ChildCoordinators.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MVVM_ChildCoordinators.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 117 | 9F64D37C72D13DA21C670CCC /* Pods_MVVM.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MVVM.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 118 | A1CA3B93DFF75755904665CD /* Pods-MVVM.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MVVM.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MVVM/Pods-MVVM.debug.xcconfig"; sourceTree = ""; }; 119 | B4D5043EF9A8AEB08804B050 /* Pods_MVVM_RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MVVM_RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 120 | F462B2220D05BA3ADC7F7FD1 /* Pods-MVVM+Coordinator.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MVVM+Coordinator.release.xcconfig"; path = "Pods/Target Support Files/Pods-MVVM+Coordinator/Pods-MVVM+Coordinator.release.xcconfig"; sourceTree = ""; }; 121 | FA117B3E608B190C7A5F67C2 /* Pods-MVVM+ChildCoordinators.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MVVM+ChildCoordinators.release.xcconfig"; path = "Pods/Target Support Files/Pods-MVVM+ChildCoordinators/Pods-MVVM+ChildCoordinators.release.xcconfig"; sourceTree = ""; }; 122 | /* End PBXFileReference section */ 123 | 124 | /* Begin PBXFrameworksBuildPhase section */ 125 | 16EA3B7B22E30F2400B18097 /* Frameworks */ = { 126 | isa = PBXFrameworksBuildPhase; 127 | buildActionMask = 2147483647; 128 | files = ( 129 | 5BAC5BD86C94458ED7065D6D /* Pods_MVVM_RxSwift.framework in Frameworks */, 130 | ); 131 | runOnlyForDeploymentPostprocessing = 0; 132 | }; 133 | 16EA3B9122E30F3C00B18097 /* Frameworks */ = { 134 | isa = PBXFrameworksBuildPhase; 135 | buildActionMask = 2147483647; 136 | files = ( 137 | 11C76D2A707CB56E78B2A33F /* Pods_MVVM.framework in Frameworks */, 138 | ); 139 | runOnlyForDeploymentPostprocessing = 0; 140 | }; 141 | 16EA3BA722E30F5A00B18097 /* Frameworks */ = { 142 | isa = PBXFrameworksBuildPhase; 143 | buildActionMask = 2147483647; 144 | files = ( 145 | A4458795E115078FEF19CB98 /* Pods_MVVM_Coordinator.framework in Frameworks */, 146 | ); 147 | runOnlyForDeploymentPostprocessing = 0; 148 | }; 149 | 16EA3BBD22E30F6300B18097 /* Frameworks */ = { 150 | isa = PBXFrameworksBuildPhase; 151 | buildActionMask = 2147483647; 152 | files = ( 153 | 1621EB77B3B5461946096A7A /* Pods_MVVM_ChildCoordinators.framework in Frameworks */, 154 | ); 155 | runOnlyForDeploymentPostprocessing = 0; 156 | }; 157 | /* End PBXFrameworksBuildPhase section */ 158 | 159 | /* Begin PBXGroup section */ 160 | 168447B022E314E400454D5E /* Model */ = { 161 | isa = PBXGroup; 162 | children = ( 163 | 168447B122E314E400454D5E /* SignInResponse.swift */, 164 | 168447B222E314E400454D5E /* Authentication.swift */, 165 | 168447B322E314E400454D5E /* SessionService.swift */, 166 | ); 167 | path = Model; 168 | sourceTree = ""; 169 | }; 170 | 168447B422E314E400454D5E /* View */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | 168447B522E314E400454D5E /* Main.storyboard */, 174 | 168447B722E314E400454D5E /* SignInViewController.swift */, 175 | ); 176 | path = View; 177 | sourceTree = ""; 178 | }; 179 | 168447B922E314E400454D5E /* ViewModel */ = { 180 | isa = PBXGroup; 181 | children = ( 182 | 168447BA22E314E400454D5E /* SignInViewModel.swift */, 183 | ); 184 | path = ViewModel; 185 | sourceTree = ""; 186 | }; 187 | 168447DA22E316FF00454D5E /* ViewModel */ = { 188 | isa = PBXGroup; 189 | children = ( 190 | 168447DB22E316FF00454D5E /* SignInViewModel.swift */, 191 | ); 192 | path = ViewModel; 193 | sourceTree = ""; 194 | }; 195 | 168447DC22E316FF00454D5E /* Model */ = { 196 | isa = PBXGroup; 197 | children = ( 198 | 168447DD22E316FF00454D5E /* SignInResponse.swift */, 199 | 168447DE22E316FF00454D5E /* Authentication.swift */, 200 | 168447DF22E316FF00454D5E /* SessionService.swift */, 201 | ); 202 | path = Model; 203 | sourceTree = ""; 204 | }; 205 | 168447E822E3175400454D5E /* Coordinator */ = { 206 | isa = PBXGroup; 207 | children = ( 208 | 168447E922E3176200454D5E /* AppCoordinator.swift */, 209 | ); 210 | path = Coordinator; 211 | sourceTree = ""; 212 | }; 213 | 168447EB22E317CE00454D5E /* Model */ = { 214 | isa = PBXGroup; 215 | children = ( 216 | 168447EC22E317CE00454D5E /* SignInResponse.swift */, 217 | 168447ED22E317CE00454D5E /* Authentication.swift */, 218 | 168447EE22E317CE00454D5E /* SessionService.swift */, 219 | ); 220 | path = Model; 221 | sourceTree = ""; 222 | }; 223 | 168447EF22E317CE00454D5E /* ViewModel */ = { 224 | isa = PBXGroup; 225 | children = ( 226 | 168447F022E317CE00454D5E /* SignInViewModel.swift */, 227 | ); 228 | path = ViewModel; 229 | sourceTree = ""; 230 | }; 231 | 168447F122E317CE00454D5E /* Coordinator */ = { 232 | isa = PBXGroup; 233 | children = ( 234 | 168447FB22E317E900454D5E /* BaseCoordinator.swift */, 235 | 168447F222E317CE00454D5E /* AppCoordinator.swift */, 236 | 168447FD22E3182F00454D5E /* SignInCoordinator.swift */, 237 | ); 238 | path = Coordinator; 239 | sourceTree = ""; 240 | }; 241 | 168447F422E317CE00454D5E /* View */ = { 242 | isa = PBXGroup; 243 | children = ( 244 | 16AA442D22E319F800FD9A66 /* Main.storyboard */, 245 | 16AA442C22E319F800FD9A66 /* SignInViewController.swift */, 246 | ); 247 | path = View; 248 | sourceTree = ""; 249 | }; 250 | 16AA441D22E3190F00FD9A66 /* View */ = { 251 | isa = PBXGroup; 252 | children = ( 253 | 16AA442922E3198300FD9A66 /* Main.storyboard */, 254 | 16AA442822E3198300FD9A66 /* SignInViewController.swift */, 255 | ); 256 | path = View; 257 | sourceTree = ""; 258 | }; 259 | 16D7B9A622E31373007475CC /* Model */ = { 260 | isa = PBXGroup; 261 | children = ( 262 | 16EA3B9822E30F3C00B18097 /* SessionService.swift */, 263 | 16D7B9A422E31367007475CC /* Authentication.swift */, 264 | 16D7B9A222E3134C007475CC /* SignInResponse.swift */, 265 | ); 266 | path = Model; 267 | sourceTree = ""; 268 | }; 269 | 16D7B9A922E3138F007475CC /* View */ = { 270 | isa = PBXGroup; 271 | children = ( 272 | 16EA3BD422E3101D00B18097 /* SignInViewController.swift */, 273 | 16EA3B9A22E30F3D00B18097 /* Main.storyboard */, 274 | ); 275 | path = View; 276 | sourceTree = ""; 277 | }; 278 | 16D7B9AA22E313A3007475CC /* ViewModel */ = { 279 | isa = PBXGroup; 280 | children = ( 281 | 16EA3BD222E30FFD00B18097 /* SignInViewModel.swift */, 282 | ); 283 | path = ViewModel; 284 | sourceTree = ""; 285 | }; 286 | 16EA3B5C22E30EF100B18097 = { 287 | isa = PBXGroup; 288 | children = ( 289 | 16EA3BD622E310FD00B18097 /* AlertExtension.swift */, 290 | 16EA3B9522E30F3C00B18097 /* MVVM */, 291 | 16EA3B7F22E30F2400B18097 /* MVVM+RxSwift */, 292 | 16EA3BAB22E30F5A00B18097 /* MVVM+Coordinator */, 293 | 16EA3BC122E30F6300B18097 /* MVVM+ChildCoordinators */, 294 | 16EA3B6622E30EF100B18097 /* Products */, 295 | 8507E2E02AF5457D22C79896 /* Pods */, 296 | C20A649BF53DF3D3EAA75C7F /* Frameworks */, 297 | ); 298 | sourceTree = ""; 299 | }; 300 | 16EA3B6622E30EF100B18097 /* Products */ = { 301 | isa = PBXGroup; 302 | children = ( 303 | 16EA3B7E22E30F2400B18097 /* MVVM+RxSwift.app */, 304 | 16EA3B9422E30F3C00B18097 /* MVVM.app */, 305 | 16EA3BAA22E30F5A00B18097 /* MVVM+Coordinator.app */, 306 | 16EA3BC022E30F6300B18097 /* MVVM+ChildCoordinators.app */, 307 | ); 308 | name = Products; 309 | sourceTree = ""; 310 | }; 311 | 16EA3B7F22E30F2400B18097 /* MVVM+RxSwift */ = { 312 | isa = PBXGroup; 313 | children = ( 314 | 168447C222E3150D00454D5E /* AppDelegate.swift */, 315 | 168447B022E314E400454D5E /* Model */, 316 | 168447B422E314E400454D5E /* View */, 317 | 168447B922E314E400454D5E /* ViewModel */, 318 | 16EA3B8722E30F2500B18097 /* Assets.xcassets */, 319 | 16EA3B8922E30F2500B18097 /* LaunchScreen.storyboard */, 320 | 16EA3B8C22E30F2500B18097 /* Info.plist */, 321 | ); 322 | path = "MVVM+RxSwift"; 323 | sourceTree = ""; 324 | }; 325 | 16EA3B9522E30F3C00B18097 /* MVVM */ = { 326 | isa = PBXGroup; 327 | children = ( 328 | 16EA3B9622E30F3C00B18097 /* AppDelegate.swift */, 329 | 16D7B9A622E31373007475CC /* Model */, 330 | 16D7B9A922E3138F007475CC /* View */, 331 | 16D7B9AA22E313A3007475CC /* ViewModel */, 332 | 16EA3B9D22E30F3D00B18097 /* Assets.xcassets */, 333 | 16EA3B9F22E30F3D00B18097 /* LaunchScreen.storyboard */, 334 | 16EA3BA222E30F3D00B18097 /* Info.plist */, 335 | ); 336 | path = MVVM; 337 | sourceTree = ""; 338 | }; 339 | 16EA3BAB22E30F5A00B18097 /* MVVM+Coordinator */ = { 340 | isa = PBXGroup; 341 | children = ( 342 | 168447E022E316FF00454D5E /* AppDelegate.swift */, 343 | 168447DC22E316FF00454D5E /* Model */, 344 | 168447DA22E316FF00454D5E /* ViewModel */, 345 | 16AA441D22E3190F00FD9A66 /* View */, 346 | 168447E822E3175400454D5E /* Coordinator */, 347 | 16EA3BB322E30F5B00B18097 /* Assets.xcassets */, 348 | 16EA3BB522E30F5B00B18097 /* LaunchScreen.storyboard */, 349 | 16EA3BB822E30F5B00B18097 /* Info.plist */, 350 | ); 351 | path = "MVVM+Coordinator"; 352 | sourceTree = ""; 353 | }; 354 | 16EA3BC122E30F6300B18097 /* MVVM+ChildCoordinators */ = { 355 | isa = PBXGroup; 356 | children = ( 357 | 168447F322E317CE00454D5E /* AppDelegate.swift */, 358 | 168447EB22E317CE00454D5E /* Model */, 359 | 168447F422E317CE00454D5E /* View */, 360 | 168447EF22E317CE00454D5E /* ViewModel */, 361 | 168447F122E317CE00454D5E /* Coordinator */, 362 | 16EA3BC922E30F6400B18097 /* Assets.xcassets */, 363 | 16EA3BCB22E30F6400B18097 /* LaunchScreen.storyboard */, 364 | 16EA3BCE22E30F6400B18097 /* Info.plist */, 365 | ); 366 | path = "MVVM+ChildCoordinators"; 367 | sourceTree = ""; 368 | }; 369 | 8507E2E02AF5457D22C79896 /* Pods */ = { 370 | isa = PBXGroup; 371 | children = ( 372 | A1CA3B93DFF75755904665CD /* Pods-MVVM.debug.xcconfig */, 373 | 4AB7F2E38440089DF849B8F7 /* Pods-MVVM.release.xcconfig */, 374 | 0EB23E3F3B58FD4072492954 /* Pods-MVVM+ChildCoordinators.debug.xcconfig */, 375 | FA117B3E608B190C7A5F67C2 /* Pods-MVVM+ChildCoordinators.release.xcconfig */, 376 | 2C344EAC4B086535E24C7D34 /* Pods-MVVM+Coordinator.debug.xcconfig */, 377 | F462B2220D05BA3ADC7F7FD1 /* Pods-MVVM+Coordinator.release.xcconfig */, 378 | 259A9A0E7B3148E97811DB5C /* Pods-MVVM+RxSwift.debug.xcconfig */, 379 | 956F0E67F7539659D79ACB1A /* Pods-MVVM+RxSwift.release.xcconfig */, 380 | ); 381 | name = Pods; 382 | sourceTree = ""; 383 | }; 384 | C20A649BF53DF3D3EAA75C7F /* Frameworks */ = { 385 | isa = PBXGroup; 386 | children = ( 387 | 9F64D37C72D13DA21C670CCC /* Pods_MVVM.framework */, 388 | 9EFCCC9DC56F1C03E41441CF /* Pods_MVVM_ChildCoordinators.framework */, 389 | 4A811D6B820D8C3B37C8FAC9 /* Pods_MVVM_Coordinator.framework */, 390 | B4D5043EF9A8AEB08804B050 /* Pods_MVVM_RxSwift.framework */, 391 | ); 392 | name = Frameworks; 393 | sourceTree = ""; 394 | }; 395 | /* End PBXGroup section */ 396 | 397 | /* Begin PBXNativeTarget section */ 398 | 16EA3B7D22E30F2400B18097 /* MVVM+RxSwift */ = { 399 | isa = PBXNativeTarget; 400 | buildConfigurationList = 16EA3B8D22E30F2500B18097 /* Build configuration list for PBXNativeTarget "MVVM+RxSwift" */; 401 | buildPhases = ( 402 | 3E92CD57B5BD5D5FD10EAA55 /* [CP] Check Pods Manifest.lock */, 403 | 16EA3B7A22E30F2400B18097 /* Sources */, 404 | 16EA3B7B22E30F2400B18097 /* Frameworks */, 405 | 16EA3B7C22E30F2400B18097 /* Resources */, 406 | 2C3EF49B6AAAB1EF6596C675 /* [CP] Embed Pods Frameworks */, 407 | F13264B700A538629F277B34 /* [CP] Copy Pods Resources */, 408 | ); 409 | buildRules = ( 410 | ); 411 | dependencies = ( 412 | ); 413 | name = "MVVM+RxSwift"; 414 | productName = "MVVM+RxSwift"; 415 | productReference = 16EA3B7E22E30F2400B18097 /* MVVM+RxSwift.app */; 416 | productType = "com.apple.product-type.application"; 417 | }; 418 | 16EA3B9322E30F3C00B18097 /* MVVM */ = { 419 | isa = PBXNativeTarget; 420 | buildConfigurationList = 16EA3BA322E30F3D00B18097 /* Build configuration list for PBXNativeTarget "MVVM" */; 421 | buildPhases = ( 422 | BD35617EA8250782A501E2EF /* [CP] Check Pods Manifest.lock */, 423 | 16EA3B9022E30F3C00B18097 /* Sources */, 424 | 16EA3B9122E30F3C00B18097 /* Frameworks */, 425 | 16EA3B9222E30F3C00B18097 /* Resources */, 426 | D113681A5A38AC08D8A5A7AD /* [CP] Embed Pods Frameworks */, 427 | 9B233BAC56F952271C88A7DB /* [CP] Copy Pods Resources */, 428 | ); 429 | buildRules = ( 430 | ); 431 | dependencies = ( 432 | ); 433 | name = MVVM; 434 | productName = MVVM; 435 | productReference = 16EA3B9422E30F3C00B18097 /* MVVM.app */; 436 | productType = "com.apple.product-type.application"; 437 | }; 438 | 16EA3BA922E30F5A00B18097 /* MVVM+Coordinator */ = { 439 | isa = PBXNativeTarget; 440 | buildConfigurationList = 16EA3BB922E30F5B00B18097 /* Build configuration list for PBXNativeTarget "MVVM+Coordinator" */; 441 | buildPhases = ( 442 | 49067AF54CFBA476F044B66B /* [CP] Check Pods Manifest.lock */, 443 | 16EA3BA622E30F5A00B18097 /* Sources */, 444 | 16EA3BA722E30F5A00B18097 /* Frameworks */, 445 | 16EA3BA822E30F5A00B18097 /* Resources */, 446 | FA2370940FCE970B380A60C6 /* [CP] Embed Pods Frameworks */, 447 | FE2E75B5C9F443F557F94F20 /* [CP] Copy Pods Resources */, 448 | ); 449 | buildRules = ( 450 | ); 451 | dependencies = ( 452 | ); 453 | name = "MVVM+Coordinator"; 454 | productName = "MVVM+Coordinator"; 455 | productReference = 16EA3BAA22E30F5A00B18097 /* MVVM+Coordinator.app */; 456 | productType = "com.apple.product-type.application"; 457 | }; 458 | 16EA3BBF22E30F6300B18097 /* MVVM+ChildCoordinators */ = { 459 | isa = PBXNativeTarget; 460 | buildConfigurationList = 16EA3BCF22E30F6400B18097 /* Build configuration list for PBXNativeTarget "MVVM+ChildCoordinators" */; 461 | buildPhases = ( 462 | 0E468BCC79A2992FEE0F1708 /* [CP] Check Pods Manifest.lock */, 463 | 16EA3BBC22E30F6300B18097 /* Sources */, 464 | 16EA3BBD22E30F6300B18097 /* Frameworks */, 465 | 16EA3BBE22E30F6300B18097 /* Resources */, 466 | 2EAF04DDC52FD6BB62E73663 /* [CP] Embed Pods Frameworks */, 467 | FDA8ADEFD4E2D94E0C4A4628 /* [CP] Copy Pods Resources */, 468 | ); 469 | buildRules = ( 470 | ); 471 | dependencies = ( 472 | ); 473 | name = "MVVM+ChildCoordinators"; 474 | productName = "MVVM+ChildCoordinators"; 475 | productReference = 16EA3BC022E30F6300B18097 /* MVVM+ChildCoordinators.app */; 476 | productType = "com.apple.product-type.application"; 477 | }; 478 | /* End PBXNativeTarget section */ 479 | 480 | /* Begin PBXProject section */ 481 | 16EA3B5D22E30EF100B18097 /* Project object */ = { 482 | isa = PBXProject; 483 | attributes = { 484 | LastSwiftUpdateCheck = 1020; 485 | LastUpgradeCheck = 1020; 486 | ORGANIZATIONNAME = "Wojciech Kulik"; 487 | TargetAttributes = { 488 | 16EA3B7D22E30F2400B18097 = { 489 | CreatedOnToolsVersion = 10.2.1; 490 | }; 491 | 16EA3B9322E30F3C00B18097 = { 492 | CreatedOnToolsVersion = 10.2.1; 493 | }; 494 | 16EA3BA922E30F5A00B18097 = { 495 | CreatedOnToolsVersion = 10.2.1; 496 | }; 497 | 16EA3BBF22E30F6300B18097 = { 498 | CreatedOnToolsVersion = 10.2.1; 499 | }; 500 | }; 501 | }; 502 | buildConfigurationList = 16EA3B6022E30EF100B18097 /* Build configuration list for PBXProject "MVVMC" */; 503 | compatibilityVersion = "Xcode 9.3"; 504 | developmentRegion = en; 505 | hasScannedForEncodings = 0; 506 | knownRegions = ( 507 | en, 508 | Base, 509 | ); 510 | mainGroup = 16EA3B5C22E30EF100B18097; 511 | productRefGroup = 16EA3B6622E30EF100B18097 /* Products */; 512 | projectDirPath = ""; 513 | projectRoot = ""; 514 | targets = ( 515 | 16EA3B9322E30F3C00B18097 /* MVVM */, 516 | 16EA3B7D22E30F2400B18097 /* MVVM+RxSwift */, 517 | 16EA3BA922E30F5A00B18097 /* MVVM+Coordinator */, 518 | 16EA3BBF22E30F6300B18097 /* MVVM+ChildCoordinators */, 519 | ); 520 | }; 521 | /* End PBXProject section */ 522 | 523 | /* Begin PBXResourcesBuildPhase section */ 524 | 16EA3B7C22E30F2400B18097 /* Resources */ = { 525 | isa = PBXResourcesBuildPhase; 526 | buildActionMask = 2147483647; 527 | files = ( 528 | 168447BE22E314E400454D5E /* Main.storyboard in Resources */, 529 | 16EA3B8B22E30F2500B18097 /* LaunchScreen.storyboard in Resources */, 530 | 16EA3B8822E30F2500B18097 /* Assets.xcassets in Resources */, 531 | ); 532 | runOnlyForDeploymentPostprocessing = 0; 533 | }; 534 | 16EA3B9222E30F3C00B18097 /* Resources */ = { 535 | isa = PBXResourcesBuildPhase; 536 | buildActionMask = 2147483647; 537 | files = ( 538 | 16EA3BA122E30F3D00B18097 /* LaunchScreen.storyboard in Resources */, 539 | 16EA3B9E22E30F3D00B18097 /* Assets.xcassets in Resources */, 540 | 16EA3B9C22E30F3D00B18097 /* Main.storyboard in Resources */, 541 | ); 542 | runOnlyForDeploymentPostprocessing = 0; 543 | }; 544 | 16EA3BA822E30F5A00B18097 /* Resources */ = { 545 | isa = PBXResourcesBuildPhase; 546 | buildActionMask = 2147483647; 547 | files = ( 548 | 16AA442B22E3198300FD9A66 /* Main.storyboard in Resources */, 549 | 16EA3BB722E30F5B00B18097 /* LaunchScreen.storyboard in Resources */, 550 | 16EA3BB422E30F5B00B18097 /* Assets.xcassets in Resources */, 551 | ); 552 | runOnlyForDeploymentPostprocessing = 0; 553 | }; 554 | 16EA3BBE22E30F6300B18097 /* Resources */ = { 555 | isa = PBXResourcesBuildPhase; 556 | buildActionMask = 2147483647; 557 | files = ( 558 | 16AA442F22E319F900FD9A66 /* Main.storyboard in Resources */, 559 | 16EA3BCD22E30F6400B18097 /* LaunchScreen.storyboard in Resources */, 560 | 16EA3BCA22E30F6400B18097 /* Assets.xcassets in Resources */, 561 | ); 562 | runOnlyForDeploymentPostprocessing = 0; 563 | }; 564 | /* End PBXResourcesBuildPhase section */ 565 | 566 | /* Begin PBXShellScriptBuildPhase section */ 567 | 0E468BCC79A2992FEE0F1708 /* [CP] Check Pods Manifest.lock */ = { 568 | isa = PBXShellScriptBuildPhase; 569 | buildActionMask = 2147483647; 570 | files = ( 571 | ); 572 | inputPaths = ( 573 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 574 | "${PODS_ROOT}/Manifest.lock", 575 | ); 576 | name = "[CP] Check Pods Manifest.lock"; 577 | outputPaths = ( 578 | "$(DERIVED_FILE_DIR)/Pods-MVVM+ChildCoordinators-checkManifestLockResult.txt", 579 | ); 580 | runOnlyForDeploymentPostprocessing = 0; 581 | shellPath = /bin/sh; 582 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 583 | showEnvVarsInLog = 0; 584 | }; 585 | 2C3EF49B6AAAB1EF6596C675 /* [CP] Embed Pods Frameworks */ = { 586 | isa = PBXShellScriptBuildPhase; 587 | buildActionMask = 2147483647; 588 | files = ( 589 | ); 590 | inputPaths = ( 591 | "${SRCROOT}/Pods/Target Support Files/Pods-MVVM+RxSwift/Pods-MVVM+RxSwift-frameworks.sh", 592 | "${BUILT_PRODUCTS_DIR}/RxAtomic/RxAtomic.framework", 593 | "${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework", 594 | "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", 595 | ); 596 | name = "[CP] Embed Pods Frameworks"; 597 | outputPaths = ( 598 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxAtomic.framework", 599 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework", 600 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", 601 | ); 602 | runOnlyForDeploymentPostprocessing = 0; 603 | shellPath = /bin/sh; 604 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MVVM+RxSwift/Pods-MVVM+RxSwift-frameworks.sh\"\n"; 605 | showEnvVarsInLog = 0; 606 | }; 607 | 2EAF04DDC52FD6BB62E73663 /* [CP] Embed Pods Frameworks */ = { 608 | isa = PBXShellScriptBuildPhase; 609 | buildActionMask = 2147483647; 610 | files = ( 611 | ); 612 | inputPaths = ( 613 | "${SRCROOT}/Pods/Target Support Files/Pods-MVVM+ChildCoordinators/Pods-MVVM+ChildCoordinators-frameworks.sh", 614 | "${BUILT_PRODUCTS_DIR}/RxAtomic/RxAtomic.framework", 615 | "${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework", 616 | "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", 617 | ); 618 | name = "[CP] Embed Pods Frameworks"; 619 | outputPaths = ( 620 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxAtomic.framework", 621 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework", 622 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", 623 | ); 624 | runOnlyForDeploymentPostprocessing = 0; 625 | shellPath = /bin/sh; 626 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MVVM+ChildCoordinators/Pods-MVVM+ChildCoordinators-frameworks.sh\"\n"; 627 | showEnvVarsInLog = 0; 628 | }; 629 | 3E92CD57B5BD5D5FD10EAA55 /* [CP] Check Pods Manifest.lock */ = { 630 | isa = PBXShellScriptBuildPhase; 631 | buildActionMask = 2147483647; 632 | files = ( 633 | ); 634 | inputPaths = ( 635 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 636 | "${PODS_ROOT}/Manifest.lock", 637 | ); 638 | name = "[CP] Check Pods Manifest.lock"; 639 | outputPaths = ( 640 | "$(DERIVED_FILE_DIR)/Pods-MVVM+RxSwift-checkManifestLockResult.txt", 641 | ); 642 | runOnlyForDeploymentPostprocessing = 0; 643 | shellPath = /bin/sh; 644 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 645 | showEnvVarsInLog = 0; 646 | }; 647 | 49067AF54CFBA476F044B66B /* [CP] Check Pods Manifest.lock */ = { 648 | isa = PBXShellScriptBuildPhase; 649 | buildActionMask = 2147483647; 650 | files = ( 651 | ); 652 | inputPaths = ( 653 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 654 | "${PODS_ROOT}/Manifest.lock", 655 | ); 656 | name = "[CP] Check Pods Manifest.lock"; 657 | outputPaths = ( 658 | "$(DERIVED_FILE_DIR)/Pods-MVVM+Coordinator-checkManifestLockResult.txt", 659 | ); 660 | runOnlyForDeploymentPostprocessing = 0; 661 | shellPath = /bin/sh; 662 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 663 | showEnvVarsInLog = 0; 664 | }; 665 | 9B233BAC56F952271C88A7DB /* [CP] Copy Pods Resources */ = { 666 | isa = PBXShellScriptBuildPhase; 667 | buildActionMask = 2147483647; 668 | files = ( 669 | ); 670 | inputPaths = ( 671 | ); 672 | name = "[CP] Copy Pods Resources"; 673 | outputPaths = ( 674 | ); 675 | runOnlyForDeploymentPostprocessing = 0; 676 | shellPath = /bin/sh; 677 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MVVM/Pods-MVVM-resources.sh\"\n"; 678 | showEnvVarsInLog = 0; 679 | }; 680 | BD35617EA8250782A501E2EF /* [CP] Check Pods Manifest.lock */ = { 681 | isa = PBXShellScriptBuildPhase; 682 | buildActionMask = 2147483647; 683 | files = ( 684 | ); 685 | inputPaths = ( 686 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 687 | "${PODS_ROOT}/Manifest.lock", 688 | ); 689 | name = "[CP] Check Pods Manifest.lock"; 690 | outputPaths = ( 691 | "$(DERIVED_FILE_DIR)/Pods-MVVM-checkManifestLockResult.txt", 692 | ); 693 | runOnlyForDeploymentPostprocessing = 0; 694 | shellPath = /bin/sh; 695 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 696 | showEnvVarsInLog = 0; 697 | }; 698 | D113681A5A38AC08D8A5A7AD /* [CP] Embed Pods Frameworks */ = { 699 | isa = PBXShellScriptBuildPhase; 700 | buildActionMask = 2147483647; 701 | files = ( 702 | ); 703 | inputPaths = ( 704 | ); 705 | name = "[CP] Embed Pods Frameworks"; 706 | outputPaths = ( 707 | ); 708 | runOnlyForDeploymentPostprocessing = 0; 709 | shellPath = /bin/sh; 710 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MVVM/Pods-MVVM-frameworks.sh\"\n"; 711 | showEnvVarsInLog = 0; 712 | }; 713 | F13264B700A538629F277B34 /* [CP] Copy Pods Resources */ = { 714 | isa = PBXShellScriptBuildPhase; 715 | buildActionMask = 2147483647; 716 | files = ( 717 | ); 718 | inputPaths = ( 719 | ); 720 | name = "[CP] Copy Pods Resources"; 721 | outputPaths = ( 722 | ); 723 | runOnlyForDeploymentPostprocessing = 0; 724 | shellPath = /bin/sh; 725 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MVVM+RxSwift/Pods-MVVM+RxSwift-resources.sh\"\n"; 726 | showEnvVarsInLog = 0; 727 | }; 728 | FA2370940FCE970B380A60C6 /* [CP] Embed Pods Frameworks */ = { 729 | isa = PBXShellScriptBuildPhase; 730 | buildActionMask = 2147483647; 731 | files = ( 732 | ); 733 | inputPaths = ( 734 | "${SRCROOT}/Pods/Target Support Files/Pods-MVVM+Coordinator/Pods-MVVM+Coordinator-frameworks.sh", 735 | "${BUILT_PRODUCTS_DIR}/RxAtomic/RxAtomic.framework", 736 | "${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework", 737 | "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", 738 | ); 739 | name = "[CP] Embed Pods Frameworks"; 740 | outputPaths = ( 741 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxAtomic.framework", 742 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework", 743 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", 744 | ); 745 | runOnlyForDeploymentPostprocessing = 0; 746 | shellPath = /bin/sh; 747 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MVVM+Coordinator/Pods-MVVM+Coordinator-frameworks.sh\"\n"; 748 | showEnvVarsInLog = 0; 749 | }; 750 | FDA8ADEFD4E2D94E0C4A4628 /* [CP] Copy Pods Resources */ = { 751 | isa = PBXShellScriptBuildPhase; 752 | buildActionMask = 2147483647; 753 | files = ( 754 | ); 755 | inputPaths = ( 756 | ); 757 | name = "[CP] Copy Pods Resources"; 758 | outputPaths = ( 759 | ); 760 | runOnlyForDeploymentPostprocessing = 0; 761 | shellPath = /bin/sh; 762 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MVVM+ChildCoordinators/Pods-MVVM+ChildCoordinators-resources.sh\"\n"; 763 | showEnvVarsInLog = 0; 764 | }; 765 | FE2E75B5C9F443F557F94F20 /* [CP] Copy Pods Resources */ = { 766 | isa = PBXShellScriptBuildPhase; 767 | buildActionMask = 2147483647; 768 | files = ( 769 | ); 770 | inputPaths = ( 771 | ); 772 | name = "[CP] Copy Pods Resources"; 773 | outputPaths = ( 774 | ); 775 | runOnlyForDeploymentPostprocessing = 0; 776 | shellPath = /bin/sh; 777 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MVVM+Coordinator/Pods-MVVM+Coordinator-resources.sh\"\n"; 778 | showEnvVarsInLog = 0; 779 | }; 780 | /* End PBXShellScriptBuildPhase section */ 781 | 782 | /* Begin PBXSourcesBuildPhase section */ 783 | 16EA3B7A22E30F2400B18097 /* Sources */ = { 784 | isa = PBXSourcesBuildPhase; 785 | buildActionMask = 2147483647; 786 | files = ( 787 | 168447C122E314E400454D5E /* SignInViewModel.swift in Sources */, 788 | 168447BD22E314E400454D5E /* SessionService.swift in Sources */, 789 | 168447BB22E314E400454D5E /* SignInResponse.swift in Sources */, 790 | 16EA3BD822E3115400B18097 /* AlertExtension.swift in Sources */, 791 | 168447C322E3150D00454D5E /* AppDelegate.swift in Sources */, 792 | 168447BF22E314E400454D5E /* SignInViewController.swift in Sources */, 793 | 168447BC22E314E400454D5E /* Authentication.swift in Sources */, 794 | ); 795 | runOnlyForDeploymentPostprocessing = 0; 796 | }; 797 | 16EA3B9022E30F3C00B18097 /* Sources */ = { 798 | isa = PBXSourcesBuildPhase; 799 | buildActionMask = 2147483647; 800 | files = ( 801 | 16D7B9A522E31367007475CC /* Authentication.swift in Sources */, 802 | 16EA3BD722E310FD00B18097 /* AlertExtension.swift in Sources */, 803 | 16EA3BD522E3101D00B18097 /* SignInViewController.swift in Sources */, 804 | 16D7B9A322E3134C007475CC /* SignInResponse.swift in Sources */, 805 | 16EA3B9922E30F3C00B18097 /* SessionService.swift in Sources */, 806 | 16EA3BD322E30FFD00B18097 /* SignInViewModel.swift in Sources */, 807 | 16EA3B9722E30F3C00B18097 /* AppDelegate.swift in Sources */, 808 | ); 809 | runOnlyForDeploymentPostprocessing = 0; 810 | }; 811 | 16EA3BA622E30F5A00B18097 /* Sources */ = { 812 | isa = PBXSourcesBuildPhase; 813 | buildActionMask = 2147483647; 814 | files = ( 815 | 168447E622E316FF00454D5E /* SessionService.swift in Sources */, 816 | 16EA3BD922E3115400B18097 /* AlertExtension.swift in Sources */, 817 | 168447E422E316FF00454D5E /* SignInResponse.swift in Sources */, 818 | 168447EA22E3176200454D5E /* AppCoordinator.swift in Sources */, 819 | 16AA442A22E3198300FD9A66 /* SignInViewController.swift in Sources */, 820 | 168447E722E316FF00454D5E /* AppDelegate.swift in Sources */, 821 | 168447E522E316FF00454D5E /* Authentication.swift in Sources */, 822 | 168447E322E316FF00454D5E /* SignInViewModel.swift in Sources */, 823 | ); 824 | runOnlyForDeploymentPostprocessing = 0; 825 | }; 826 | 16EA3BBC22E30F6300B18097 /* Sources */ = { 827 | isa = PBXSourcesBuildPhase; 828 | buildActionMask = 2147483647; 829 | files = ( 830 | 168447F922E317CE00454D5E /* AppCoordinator.swift in Sources */, 831 | 168447F722E317CE00454D5E /* SessionService.swift in Sources */, 832 | 168447F522E317CE00454D5E /* SignInResponse.swift in Sources */, 833 | 16EA3BDA22E3115400B18097 /* AlertExtension.swift in Sources */, 834 | 168447FE22E3182F00454D5E /* SignInCoordinator.swift in Sources */, 835 | 168447FA22E317CE00454D5E /* AppDelegate.swift in Sources */, 836 | 168447F622E317CE00454D5E /* Authentication.swift in Sources */, 837 | 168447F822E317CE00454D5E /* SignInViewModel.swift in Sources */, 838 | 16AA442E22E319F900FD9A66 /* SignInViewController.swift in Sources */, 839 | 168447FC22E317E900454D5E /* BaseCoordinator.swift in Sources */, 840 | ); 841 | runOnlyForDeploymentPostprocessing = 0; 842 | }; 843 | /* End PBXSourcesBuildPhase section */ 844 | 845 | /* Begin PBXVariantGroup section */ 846 | 168447B522E314E400454D5E /* Main.storyboard */ = { 847 | isa = PBXVariantGroup; 848 | children = ( 849 | 168447B622E314E400454D5E /* Base */, 850 | ); 851 | name = Main.storyboard; 852 | sourceTree = ""; 853 | }; 854 | 16EA3B8922E30F2500B18097 /* LaunchScreen.storyboard */ = { 855 | isa = PBXVariantGroup; 856 | children = ( 857 | 16EA3B8A22E30F2500B18097 /* Base */, 858 | ); 859 | name = LaunchScreen.storyboard; 860 | sourceTree = ""; 861 | }; 862 | 16EA3B9A22E30F3D00B18097 /* Main.storyboard */ = { 863 | isa = PBXVariantGroup; 864 | children = ( 865 | 16EA3B9B22E30F3D00B18097 /* Base */, 866 | ); 867 | name = Main.storyboard; 868 | sourceTree = ""; 869 | }; 870 | 16EA3B9F22E30F3D00B18097 /* LaunchScreen.storyboard */ = { 871 | isa = PBXVariantGroup; 872 | children = ( 873 | 16EA3BA022E30F3D00B18097 /* Base */, 874 | ); 875 | name = LaunchScreen.storyboard; 876 | sourceTree = ""; 877 | }; 878 | 16EA3BB522E30F5B00B18097 /* LaunchScreen.storyboard */ = { 879 | isa = PBXVariantGroup; 880 | children = ( 881 | 16EA3BB622E30F5B00B18097 /* Base */, 882 | ); 883 | name = LaunchScreen.storyboard; 884 | sourceTree = ""; 885 | }; 886 | 16EA3BCB22E30F6400B18097 /* LaunchScreen.storyboard */ = { 887 | isa = PBXVariantGroup; 888 | children = ( 889 | 16EA3BCC22E30F6400B18097 /* Base */, 890 | ); 891 | name = LaunchScreen.storyboard; 892 | sourceTree = ""; 893 | }; 894 | /* End PBXVariantGroup section */ 895 | 896 | /* Begin XCBuildConfiguration section */ 897 | 16EA3B7522E30EF400B18097 /* Debug */ = { 898 | isa = XCBuildConfiguration; 899 | buildSettings = { 900 | ALWAYS_SEARCH_USER_PATHS = NO; 901 | CLANG_ANALYZER_NONNULL = YES; 902 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 903 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 904 | CLANG_CXX_LIBRARY = "libc++"; 905 | CLANG_ENABLE_MODULES = YES; 906 | CLANG_ENABLE_OBJC_ARC = YES; 907 | CLANG_ENABLE_OBJC_WEAK = YES; 908 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 909 | CLANG_WARN_BOOL_CONVERSION = YES; 910 | CLANG_WARN_COMMA = YES; 911 | CLANG_WARN_CONSTANT_CONVERSION = YES; 912 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 913 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 914 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 915 | CLANG_WARN_EMPTY_BODY = YES; 916 | CLANG_WARN_ENUM_CONVERSION = YES; 917 | CLANG_WARN_INFINITE_RECURSION = YES; 918 | CLANG_WARN_INT_CONVERSION = YES; 919 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 920 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 921 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 922 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 923 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 924 | CLANG_WARN_STRICT_PROTOTYPES = YES; 925 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 926 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 927 | CLANG_WARN_UNREACHABLE_CODE = YES; 928 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 929 | CODE_SIGN_IDENTITY = "iPhone Developer"; 930 | COPY_PHASE_STRIP = NO; 931 | DEBUG_INFORMATION_FORMAT = dwarf; 932 | ENABLE_STRICT_OBJC_MSGSEND = YES; 933 | ENABLE_TESTABILITY = YES; 934 | GCC_C_LANGUAGE_STANDARD = gnu11; 935 | GCC_DYNAMIC_NO_PIC = NO; 936 | GCC_NO_COMMON_BLOCKS = YES; 937 | GCC_OPTIMIZATION_LEVEL = 0; 938 | GCC_PREPROCESSOR_DEFINITIONS = ( 939 | "DEBUG=1", 940 | "$(inherited)", 941 | ); 942 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 943 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 944 | GCC_WARN_UNDECLARED_SELECTOR = YES; 945 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 946 | GCC_WARN_UNUSED_FUNCTION = YES; 947 | GCC_WARN_UNUSED_VARIABLE = YES; 948 | IPHONEOS_DEPLOYMENT_TARGET = 12.2; 949 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 950 | MTL_FAST_MATH = YES; 951 | ONLY_ACTIVE_ARCH = YES; 952 | SDKROOT = iphoneos; 953 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 954 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 955 | }; 956 | name = Debug; 957 | }; 958 | 16EA3B7622E30EF400B18097 /* Release */ = { 959 | isa = XCBuildConfiguration; 960 | buildSettings = { 961 | ALWAYS_SEARCH_USER_PATHS = NO; 962 | CLANG_ANALYZER_NONNULL = YES; 963 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 964 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 965 | CLANG_CXX_LIBRARY = "libc++"; 966 | CLANG_ENABLE_MODULES = YES; 967 | CLANG_ENABLE_OBJC_ARC = YES; 968 | CLANG_ENABLE_OBJC_WEAK = YES; 969 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 970 | CLANG_WARN_BOOL_CONVERSION = YES; 971 | CLANG_WARN_COMMA = YES; 972 | CLANG_WARN_CONSTANT_CONVERSION = YES; 973 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 974 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 975 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 976 | CLANG_WARN_EMPTY_BODY = YES; 977 | CLANG_WARN_ENUM_CONVERSION = YES; 978 | CLANG_WARN_INFINITE_RECURSION = YES; 979 | CLANG_WARN_INT_CONVERSION = YES; 980 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 981 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 982 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 983 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 984 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 985 | CLANG_WARN_STRICT_PROTOTYPES = YES; 986 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 987 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 988 | CLANG_WARN_UNREACHABLE_CODE = YES; 989 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 990 | CODE_SIGN_IDENTITY = "iPhone Developer"; 991 | COPY_PHASE_STRIP = NO; 992 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 993 | ENABLE_NS_ASSERTIONS = NO; 994 | ENABLE_STRICT_OBJC_MSGSEND = YES; 995 | GCC_C_LANGUAGE_STANDARD = gnu11; 996 | GCC_NO_COMMON_BLOCKS = YES; 997 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 998 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 999 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1000 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1001 | GCC_WARN_UNUSED_FUNCTION = YES; 1002 | GCC_WARN_UNUSED_VARIABLE = YES; 1003 | IPHONEOS_DEPLOYMENT_TARGET = 12.2; 1004 | MTL_ENABLE_DEBUG_INFO = NO; 1005 | MTL_FAST_MATH = YES; 1006 | SDKROOT = iphoneos; 1007 | SWIFT_COMPILATION_MODE = wholemodule; 1008 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 1009 | VALIDATE_PRODUCT = YES; 1010 | }; 1011 | name = Release; 1012 | }; 1013 | 16EA3B8E22E30F2500B18097 /* Debug */ = { 1014 | isa = XCBuildConfiguration; 1015 | baseConfigurationReference = 259A9A0E7B3148E97811DB5C /* Pods-MVVM+RxSwift.debug.xcconfig */; 1016 | buildSettings = { 1017 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1018 | CODE_SIGN_STYLE = Automatic; 1019 | DEVELOPMENT_TEAM = ""; 1020 | INFOPLIST_FILE = "MVVM+RxSwift/Info.plist"; 1021 | LD_RUNPATH_SEARCH_PATHS = ( 1022 | "$(inherited)", 1023 | "@executable_path/Frameworks", 1024 | ); 1025 | PRODUCT_BUNDLE_IDENTIFIER = "pl.wojciechkulik.MVVM-RxSwift"; 1026 | PRODUCT_NAME = "$(TARGET_NAME)"; 1027 | SWIFT_VERSION = 5.0; 1028 | TARGETED_DEVICE_FAMILY = "1,2"; 1029 | }; 1030 | name = Debug; 1031 | }; 1032 | 16EA3B8F22E30F2500B18097 /* Release */ = { 1033 | isa = XCBuildConfiguration; 1034 | baseConfigurationReference = 956F0E67F7539659D79ACB1A /* Pods-MVVM+RxSwift.release.xcconfig */; 1035 | buildSettings = { 1036 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1037 | CODE_SIGN_STYLE = Automatic; 1038 | DEVELOPMENT_TEAM = ""; 1039 | INFOPLIST_FILE = "MVVM+RxSwift/Info.plist"; 1040 | LD_RUNPATH_SEARCH_PATHS = ( 1041 | "$(inherited)", 1042 | "@executable_path/Frameworks", 1043 | ); 1044 | PRODUCT_BUNDLE_IDENTIFIER = "pl.wojciechkulik.MVVM-RxSwift"; 1045 | PRODUCT_NAME = "$(TARGET_NAME)"; 1046 | SWIFT_VERSION = 5.0; 1047 | TARGETED_DEVICE_FAMILY = "1,2"; 1048 | }; 1049 | name = Release; 1050 | }; 1051 | 16EA3BA422E30F3D00B18097 /* Debug */ = { 1052 | isa = XCBuildConfiguration; 1053 | baseConfigurationReference = A1CA3B93DFF75755904665CD /* Pods-MVVM.debug.xcconfig */; 1054 | buildSettings = { 1055 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1056 | CODE_SIGN_STYLE = Automatic; 1057 | DEVELOPMENT_TEAM = ""; 1058 | INFOPLIST_FILE = MVVM/Info.plist; 1059 | LD_RUNPATH_SEARCH_PATHS = ( 1060 | "$(inherited)", 1061 | "@executable_path/Frameworks", 1062 | ); 1063 | PRODUCT_BUNDLE_IDENTIFIER = pl.wojciechkulik.MVVM; 1064 | PRODUCT_NAME = "$(TARGET_NAME)"; 1065 | SWIFT_VERSION = 5.0; 1066 | TARGETED_DEVICE_FAMILY = "1,2"; 1067 | }; 1068 | name = Debug; 1069 | }; 1070 | 16EA3BA522E30F3D00B18097 /* Release */ = { 1071 | isa = XCBuildConfiguration; 1072 | baseConfigurationReference = 4AB7F2E38440089DF849B8F7 /* Pods-MVVM.release.xcconfig */; 1073 | buildSettings = { 1074 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1075 | CODE_SIGN_STYLE = Automatic; 1076 | DEVELOPMENT_TEAM = ""; 1077 | INFOPLIST_FILE = MVVM/Info.plist; 1078 | LD_RUNPATH_SEARCH_PATHS = ( 1079 | "$(inherited)", 1080 | "@executable_path/Frameworks", 1081 | ); 1082 | PRODUCT_BUNDLE_IDENTIFIER = pl.wojciechkulik.MVVM; 1083 | PRODUCT_NAME = "$(TARGET_NAME)"; 1084 | SWIFT_VERSION = 5.0; 1085 | TARGETED_DEVICE_FAMILY = "1,2"; 1086 | }; 1087 | name = Release; 1088 | }; 1089 | 16EA3BBA22E30F5B00B18097 /* Debug */ = { 1090 | isa = XCBuildConfiguration; 1091 | baseConfigurationReference = 2C344EAC4B086535E24C7D34 /* Pods-MVVM+Coordinator.debug.xcconfig */; 1092 | buildSettings = { 1093 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1094 | CODE_SIGN_STYLE = Automatic; 1095 | DEVELOPMENT_TEAM = ""; 1096 | INFOPLIST_FILE = "MVVM+Coordinator/Info.plist"; 1097 | LD_RUNPATH_SEARCH_PATHS = ( 1098 | "$(inherited)", 1099 | "@executable_path/Frameworks", 1100 | ); 1101 | PRODUCT_BUNDLE_IDENTIFIER = "pl.wojciechkulik.MVVM-Coordinator"; 1102 | PRODUCT_NAME = "$(TARGET_NAME)"; 1103 | SWIFT_VERSION = 5.0; 1104 | TARGETED_DEVICE_FAMILY = "1,2"; 1105 | }; 1106 | name = Debug; 1107 | }; 1108 | 16EA3BBB22E30F5B00B18097 /* Release */ = { 1109 | isa = XCBuildConfiguration; 1110 | baseConfigurationReference = F462B2220D05BA3ADC7F7FD1 /* Pods-MVVM+Coordinator.release.xcconfig */; 1111 | buildSettings = { 1112 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1113 | CODE_SIGN_STYLE = Automatic; 1114 | DEVELOPMENT_TEAM = ""; 1115 | INFOPLIST_FILE = "MVVM+Coordinator/Info.plist"; 1116 | LD_RUNPATH_SEARCH_PATHS = ( 1117 | "$(inherited)", 1118 | "@executable_path/Frameworks", 1119 | ); 1120 | PRODUCT_BUNDLE_IDENTIFIER = "pl.wojciechkulik.MVVM-Coordinator"; 1121 | PRODUCT_NAME = "$(TARGET_NAME)"; 1122 | SWIFT_VERSION = 5.0; 1123 | TARGETED_DEVICE_FAMILY = "1,2"; 1124 | }; 1125 | name = Release; 1126 | }; 1127 | 16EA3BD022E30F6400B18097 /* Debug */ = { 1128 | isa = XCBuildConfiguration; 1129 | baseConfigurationReference = 0EB23E3F3B58FD4072492954 /* Pods-MVVM+ChildCoordinators.debug.xcconfig */; 1130 | buildSettings = { 1131 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1132 | CODE_SIGN_STYLE = Automatic; 1133 | DEVELOPMENT_TEAM = ""; 1134 | INFOPLIST_FILE = "MVVM+ChildCoordinators/Info.plist"; 1135 | LD_RUNPATH_SEARCH_PATHS = ( 1136 | "$(inherited)", 1137 | "@executable_path/Frameworks", 1138 | ); 1139 | PRODUCT_BUNDLE_IDENTIFIER = "pl.wojciechkulik.MVVM-ChildCoordinators"; 1140 | PRODUCT_NAME = "$(TARGET_NAME)"; 1141 | SWIFT_VERSION = 5.0; 1142 | TARGETED_DEVICE_FAMILY = "1,2"; 1143 | }; 1144 | name = Debug; 1145 | }; 1146 | 16EA3BD122E30F6400B18097 /* Release */ = { 1147 | isa = XCBuildConfiguration; 1148 | baseConfigurationReference = FA117B3E608B190C7A5F67C2 /* Pods-MVVM+ChildCoordinators.release.xcconfig */; 1149 | buildSettings = { 1150 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1151 | CODE_SIGN_STYLE = Automatic; 1152 | DEVELOPMENT_TEAM = ""; 1153 | INFOPLIST_FILE = "MVVM+ChildCoordinators/Info.plist"; 1154 | LD_RUNPATH_SEARCH_PATHS = ( 1155 | "$(inherited)", 1156 | "@executable_path/Frameworks", 1157 | ); 1158 | PRODUCT_BUNDLE_IDENTIFIER = "pl.wojciechkulik.MVVM-ChildCoordinators"; 1159 | PRODUCT_NAME = "$(TARGET_NAME)"; 1160 | SWIFT_VERSION = 5.0; 1161 | TARGETED_DEVICE_FAMILY = "1,2"; 1162 | }; 1163 | name = Release; 1164 | }; 1165 | /* End XCBuildConfiguration section */ 1166 | 1167 | /* Begin XCConfigurationList section */ 1168 | 16EA3B6022E30EF100B18097 /* Build configuration list for PBXProject "MVVMC" */ = { 1169 | isa = XCConfigurationList; 1170 | buildConfigurations = ( 1171 | 16EA3B7522E30EF400B18097 /* Debug */, 1172 | 16EA3B7622E30EF400B18097 /* Release */, 1173 | ); 1174 | defaultConfigurationIsVisible = 0; 1175 | defaultConfigurationName = Release; 1176 | }; 1177 | 16EA3B8D22E30F2500B18097 /* Build configuration list for PBXNativeTarget "MVVM+RxSwift" */ = { 1178 | isa = XCConfigurationList; 1179 | buildConfigurations = ( 1180 | 16EA3B8E22E30F2500B18097 /* Debug */, 1181 | 16EA3B8F22E30F2500B18097 /* Release */, 1182 | ); 1183 | defaultConfigurationIsVisible = 0; 1184 | defaultConfigurationName = Release; 1185 | }; 1186 | 16EA3BA322E30F3D00B18097 /* Build configuration list for PBXNativeTarget "MVVM" */ = { 1187 | isa = XCConfigurationList; 1188 | buildConfigurations = ( 1189 | 16EA3BA422E30F3D00B18097 /* Debug */, 1190 | 16EA3BA522E30F3D00B18097 /* Release */, 1191 | ); 1192 | defaultConfigurationIsVisible = 0; 1193 | defaultConfigurationName = Release; 1194 | }; 1195 | 16EA3BB922E30F5B00B18097 /* Build configuration list for PBXNativeTarget "MVVM+Coordinator" */ = { 1196 | isa = XCConfigurationList; 1197 | buildConfigurations = ( 1198 | 16EA3BBA22E30F5B00B18097 /* Debug */, 1199 | 16EA3BBB22E30F5B00B18097 /* Release */, 1200 | ); 1201 | defaultConfigurationIsVisible = 0; 1202 | defaultConfigurationName = Release; 1203 | }; 1204 | 16EA3BCF22E30F6400B18097 /* Build configuration list for PBXNativeTarget "MVVM+ChildCoordinators" */ = { 1205 | isa = XCConfigurationList; 1206 | buildConfigurations = ( 1207 | 16EA3BD022E30F6400B18097 /* Debug */, 1208 | 16EA3BD122E30F6400B18097 /* Release */, 1209 | ); 1210 | defaultConfigurationIsVisible = 0; 1211 | defaultConfigurationName = Release; 1212 | }; 1213 | /* End XCConfigurationList section */ 1214 | }; 1215 | rootObject = 16EA3B5D22E30EF100B18097 /* Project object */; 1216 | } 1217 | --------------------------------------------------------------------------------