diff --git a/XCoordinator-Example.xcodeproj/project.pbxproj b/XCoordinator-Example.xcodeproj/project.pbxproj index 10a4ee7..ca7700d 100644 --- a/XCoordinator-Example.xcodeproj/project.pbxproj +++ b/XCoordinator-Example.xcodeproj/project.pbxproj @@ -57,7 +57,6 @@ 9B5657D42315FB3500F4F4F7 /* TransitionAnimation+Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B5657A42315FB3500F4F4F7 /* TransitionAnimation+Defaults.swift */; }; 9B5657D62315FB3500F4F4F7 /* CGAffineTransform+InPlace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B5657A62315FB3500F4F4F7 /* CGAffineTransform+InPlace.swift */; }; 9B5657D92315FB9700F4F4F7 /* Action in Frameworks */ = {isa = PBXBuildFile; productRef = 9B5657D82315FB9700F4F4F7 /* Action */; }; - 9B5657DC2315FC1000F4F4F7 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 9B5657DB2315FC1000F4F4F7 /* RxCocoa */; }; 9BD3EBF42330CE46005861BF /* Transitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BD3EBF32330CE46005861BF /* Transitions.swift */; }; 9BD3EBFD2330D84F005861BF /* XCText+Extras.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BD3EBF62330D84E005861BF /* XCText+Extras.swift */; }; 9BD3EBFE2330D84F005861BF /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BD3EBF72330D84F005861BF /* XCTestManifests.swift */; }; @@ -167,7 +166,6 @@ buildActionMask = 2147483647; files = ( 9B0A753A2316C1810092CA3A /* XCoordinatorRx in Frameworks */, - 9B5657DC2315FC1000F4F4F7 /* RxCocoa in Frameworks */, 9B5657D92315FB9700F4F4F7 /* Action in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -449,7 +447,6 @@ name = "XCoordinator-Example"; packageProductDependencies = ( 9B5657D82315FB9700F4F4F7 /* Action */, - 9B5657DB2315FC1000F4F4F7 /* RxCocoa */, 9B0A75392316C1810092CA3A /* XCoordinatorRx */, ); productName = "XCoordinator-Example"; @@ -526,7 +523,6 @@ mainGroup = 9B56572C2315FA7B00F4F4F7; packageReferences = ( 9B5657D72315FB9700F4F4F7 /* XCRemoteSwiftPackageReference "Action" */, - 9B5657DA2315FC1000F4F4F7 /* XCRemoteSwiftPackageReference "RxSwift" */, 9B5657DD2315FC5C00F4F4F7 /* XCRemoteSwiftPackageReference "XCoordinator" */, ); productRefGroup = 9B5657362315FA7B00F4F4F7 /* Products */; @@ -956,20 +952,12 @@ minimumVersion = 4.0.1; }; }; - 9B5657DA2315FC1000F4F4F7 /* XCRemoteSwiftPackageReference "RxSwift" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/ReactiveX/RxSwift.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 5.0.1; - }; - }; 9B5657DD2315FC5C00F4F4F7 /* XCRemoteSwiftPackageReference "XCoordinator" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/quickbirdstudios/XCoordinator.git"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 2.0.2; + branch = feature/3.0.0; + kind = branch; }; }; /* End XCRemoteSwiftPackageReference section */ @@ -985,11 +973,6 @@ package = 9B5657D72315FB9700F4F4F7 /* XCRemoteSwiftPackageReference "Action" */; productName = Action; }; - 9B5657DB2315FC1000F4F4F7 /* RxCocoa */ = { - isa = XCSwiftPackageProductDependency; - package = 9B5657DA2315FC1000F4F4F7 /* XCRemoteSwiftPackageReference "RxSwift" */; - productName = RxCocoa; - }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 9B56572D2315FA7B00F4F4F7 /* Project object */; diff --git a/XCoordinator-Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/XCoordinator-Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 2f97f0c..f178ff5 100644 --- a/XCoordinator-Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/XCoordinator-Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,34 +1,32 @@ { - "object": { - "pins": [ - { - "package": "Action", - "repositoryURL": "https://github.com/RxSwiftCommunity/Action.git", - "state": { - "branch": null, - "revision": "cdade63f7bbe1f5e1eff7779e5858a796dc2c001", - "version": "4.0.1" - } - }, - { - "package": "RxSwift", - "repositoryURL": "https://github.com/ReactiveX/RxSwift.git", - "state": { - "branch": null, - "revision": "b3e888b4972d9bc76495dd74d30a8c7fad4b9395", - "version": "5.0.1" - } - }, - { - "package": "XCoordinator", - "repositoryURL": "https://github.com/quickbirdstudios/XCoordinator.git", - "state": { - "branch": null, - "revision": "0c16cc7061f93d278279137277efb13385e960a6", - "version": "2.0.5" - } + "pins" : [ + { + "identity" : "action", + "kind" : "remoteSourceControl", + "location" : "https://github.com/RxSwiftCommunity/Action.git", + "state" : { + "revision" : "21110e93ef7b08ce9f01806827e4f381b5b09ab1", + "version" : "4.3.0" } - ] - }, - "version": 1 + }, + { + "identity" : "rxswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReactiveX/RxSwift.git", + "state" : { + "revision" : "b4307ba0b6425c0ba4178e138799946c3da594f8", + "version" : "6.5.0" + } + }, + { + "identity" : "xcoordinator", + "kind" : "remoteSourceControl", + "location" : "https://github.com/quickbirdstudios/XCoordinator.git", + "state" : { + "branch" : "feature/3.0.0", + "revision" : "aef3a89868b4e12e6191f2d72282cb9415dbc6ea" + } + } + ], + "version" : 2 } diff --git a/XCoordinator-Example/Common/AppDelegate.swift b/XCoordinator-Example/Common/AppDelegate.swift index 0db0077..9b54e3c 100644 --- a/XCoordinator-Example/Common/AppDelegate.swift +++ b/XCoordinator-Example/Common/AppDelegate.swift @@ -7,6 +7,7 @@ // import UIKit +import XCoordinator @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { @@ -14,7 +15,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // MARK: Stored properties private lazy var mainWindow = UIWindow() - private let router = AppCoordinator().strongRouter + private let router: any Router = AppCoordinator() // MARK: UIApplicationDelegate diff --git a/XCoordinator-Example/Coordinators/AboutCoordinator.swift b/XCoordinator-Example/Coordinators/AboutCoordinator.swift index 2a39280..f05737b 100644 --- a/XCoordinator-Example/Coordinators/AboutCoordinator.swift +++ b/XCoordinator-Example/Coordinators/AboutCoordinator.swift @@ -29,7 +29,7 @@ class AboutCoordinator: NavigationCoordinator { switch route { case .home: let viewController = AboutViewController() - let viewModel = AboutViewModelImpl(router: unownedRouter) + let viewModel = AboutViewModelImpl(router: self) viewController.bind(to: viewModel) return .push(viewController) case .website: diff --git a/XCoordinator-Example/Coordinators/AppCoordinator.swift b/XCoordinator-Example/Coordinators/AppCoordinator.swift index a1b356c..537d671 100644 --- a/XCoordinator-Example/Coordinators/AppCoordinator.swift +++ b/XCoordinator-Example/Coordinators/AppCoordinator.swift @@ -11,7 +11,7 @@ import XCoordinator enum AppRoute: Route { case login - case home(StrongRouter?) + case home((any Router)?) case newsDetail(News) } @@ -29,12 +29,12 @@ class AppCoordinator: NavigationCoordinator { switch route { case .login: let viewController = LoginViewController.instantiateFromNib() - let viewModel = LoginViewModelImpl(router: unownedRouter) + let viewModel = LoginViewModelImpl(router: self) viewController.bind(to: viewModel) return .push(viewController) case let .home(router): - if let router = router { - return .presentFullScreen(router, animation: .fade) + if let router { + return .presentFullScreen(router.asPresentable, animation: .fade) } let alert = UIAlertController( title: "How would you like to login?", @@ -42,27 +42,31 @@ class AppCoordinator: NavigationCoordinator { preferredStyle: .alert) alert.addAction( .init(title: "\(HomeTabCoordinator.self)", style: .default) { [unowned self] _ in - self.trigger(.home(HomeTabCoordinator().strongRouter)) + self.trigger(.home(HomeTabCoordinator())) } ) alert.addAction( .init(title: "\(HomeSplitCoordinator.self)", style: .default) { [unowned self] _ in - self.trigger(.home(HomeSplitCoordinator().strongRouter)) + self.trigger(.home(HomeSplitCoordinator())) } ) alert.addAction( .init(title: "\(HomePageCoordinator.self)", style: .default) { [unowned self] _ in - self.trigger(.home(HomePageCoordinator().strongRouter)) + self.trigger(.home(HomePageCoordinator())) } ) alert.addAction( .init(title: "Random", style: .default) { [unowned self] _ in - let routers: [() -> StrongRouter] = [ - { HomeTabCoordinator().strongRouter }, - { HomeSplitCoordinator().strongRouter }, - { HomeTabCoordinator().strongRouter } - ] - let router = routers.randomElement().map { $0() } + let router: any Router = { + switch Int.random(in: 0..<3) { + case 0: + return HomeTabCoordinator() + case 1: + return HomeSplitCoordinator() + default: + return HomeTabCoordinator() + } + }() self.trigger(.home(router)) } ) @@ -71,7 +75,7 @@ class AppCoordinator: NavigationCoordinator { return .multiple( .dismissAll(), .popToRoot(), - deepLink(AppRoute.home(HomePageCoordinator().strongRouter), + deepLink(AppRoute.home(HomePageCoordinator()), HomeRoute.news, NewsRoute.newsDetail(news)) ) diff --git a/XCoordinator-Example/Coordinators/HomePageCoordinator.swift b/XCoordinator-Example/Coordinators/HomePageCoordinator.swift index da623b5..927e205 100644 --- a/XCoordinator-Example/Coordinators/HomePageCoordinator.swift +++ b/XCoordinator-Example/Coordinators/HomePageCoordinator.swift @@ -12,13 +12,13 @@ class HomePageCoordinator: PageCoordinator { // MARK: Stored properties - private let newsRouter: StrongRouter - private let userListRouter: StrongRouter + private let newsRouter: any Router + private let userListRouter: any Router // MARK: Initialization - init(newsRouter: StrongRouter = NewsCoordinator().strongRouter, - userListRouter: StrongRouter = UserListCoordinator().strongRouter) { + init(newsRouter: any Router = NewsCoordinator(), + userListRouter: any Router = UserListCoordinator()) { self.newsRouter = newsRouter self.userListRouter = userListRouter @@ -26,8 +26,8 @@ class HomePageCoordinator: PageCoordinator { rootViewController: .init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil), - pages: [userListRouter, newsRouter], loop: false, - set: userListRouter, direction: .forward + pages: [userListRouter.asPresentable, newsRouter.asPresentable], loop: false, + set: userListRouter.asPresentable, direction: .forward ) } @@ -36,9 +36,9 @@ class HomePageCoordinator: PageCoordinator { override func prepareTransition(for route: HomeRoute) -> PageTransition { switch route { case .news: - return .set(newsRouter, direction: .forward) + return .set(newsRouter.asPresentable, direction: .forward) case .userList: - return .set(userListRouter, direction: .reverse) + return .set(userListRouter.asPresentable, direction: .reverse) } } diff --git a/XCoordinator-Example/Coordinators/HomeSplitCoordinator.swift b/XCoordinator-Example/Coordinators/HomeSplitCoordinator.swift index 290620f..9256f6a 100644 --- a/XCoordinator-Example/Coordinators/HomeSplitCoordinator.swift +++ b/XCoordinator-Example/Coordinators/HomeSplitCoordinator.swift @@ -12,17 +12,17 @@ class HomeSplitCoordinator: SplitCoordinator { // MARK: Stored properties - private let newsRouter: StrongRouter - private let userListRouter: StrongRouter + private let newsRouter: any Router + private let userListRouter: any Router // MARK: Initialization - init(newsRouter: StrongRouter = NewsCoordinator().strongRouter, - userListRouter: StrongRouter = UserListCoordinator().strongRouter) { + init(newsRouter: any Router = NewsCoordinator(), + userListRouter: any Router = UserListCoordinator()) { self.newsRouter = newsRouter self.userListRouter = userListRouter - super.init(master: userListRouter, detail: newsRouter) + super.init(primary: userListRouter.asPresentable, secondary: newsRouter.asPresentable) } // MARK: Overrides @@ -30,9 +30,9 @@ class HomeSplitCoordinator: SplitCoordinator { override func prepareTransition(for route: HomeRoute) -> SplitTransition { switch route { case .news: - return .showDetail(newsRouter) + return .showDetail(newsRouter.asPresentable) case .userList: - return .show(userListRouter) + return .show(userListRouter.asPresentable) } } diff --git a/XCoordinator-Example/Coordinators/HomeTabCoordinator.swift b/XCoordinator-Example/Coordinators/HomeTabCoordinator.swift index 377fb98..bb3d466 100644 --- a/XCoordinator-Example/Coordinators/HomeTabCoordinator.swift +++ b/XCoordinator-Example/Coordinators/HomeTabCoordinator.swift @@ -18,8 +18,8 @@ class HomeTabCoordinator: TabBarCoordinator { // MARK: Stored properties - private let newsRouter: StrongRouter - private let userListRouter: StrongRouter + private let newsRouter: any Router + private let userListRouter: any Router // MARK: Initialization @@ -30,16 +30,14 @@ class HomeTabCoordinator: TabBarCoordinator { let userListCoordinator = UserListCoordinator() userListCoordinator.rootViewController.tabBarItem = UITabBarItem(tabBarSystemItem: .more, tag: 1) - self.init(newsRouter: newsCoordinator.strongRouter, - userListRouter: userListCoordinator.strongRouter) + self.init(newsRouter: newsCoordinator, userListRouter: userListCoordinator) } - init(newsRouter: StrongRouter, - userListRouter: StrongRouter) { + init(newsRouter: any Router, userListRouter: any Router) { self.newsRouter = newsRouter self.userListRouter = userListRouter - super.init(tabs: [newsRouter, userListRouter], select: userListRouter) + super.init(tabs: [newsRouter.asPresentable, userListRouter.asPresentable], select: userListRouter.asPresentable) } // MARK: Overrides @@ -47,9 +45,9 @@ class HomeTabCoordinator: TabBarCoordinator { override func prepareTransition(for route: HomeRoute) -> TabBarTransition { switch route { case .news: - return .select(newsRouter) + return .select(newsRouter.asPresentable) case .userList: - return .select(userListRouter) + return .select(userListRouter.asPresentable) } } diff --git a/XCoordinator-Example/Coordinators/NewsCoordinator.swift b/XCoordinator-Example/Coordinators/NewsCoordinator.swift index 8429d61..4599929 100644 --- a/XCoordinator-Example/Coordinators/NewsCoordinator.swift +++ b/XCoordinator-Example/Coordinators/NewsCoordinator.swift @@ -29,7 +29,7 @@ class NewsCoordinator: NavigationCoordinator { case .news: let viewController = NewsViewController.instantiateFromNib() let service = MockNewsService() - let viewModel = NewsViewModelImpl(newsService: service, router: unownedRouter) + let viewModel = NewsViewModelImpl(newsService: service, router: self) viewController.bind(to: viewModel) return .push(viewController) case .newsDetail(let news): diff --git a/XCoordinator-Example/Coordinators/UserCoordinator.swift b/XCoordinator-Example/Coordinators/UserCoordinator.swift index d6f6947..06eda27 100644 --- a/XCoordinator-Example/Coordinators/UserCoordinator.swift +++ b/XCoordinator-Example/Coordinators/UserCoordinator.swift @@ -34,7 +34,7 @@ class UserCoordinator: NavigationCoordinator { return .push(viewController, animation: .fade) case let .user(username): let viewController = UserViewController.instantiateFromNib() - let viewModel = UserViewModelImpl(router: unownedRouter, username: username) + let viewModel = UserViewModelImpl(router: self, username: username) viewController.bind(to: viewModel) return .push(viewController) case let .alert(title, message): diff --git a/XCoordinator-Example/Coordinators/UserListCoordinator.swift b/XCoordinator-Example/Coordinators/UserListCoordinator.swift index 6d44a92..026d512 100644 --- a/XCoordinator-Example/Coordinators/UserListCoordinator.swift +++ b/XCoordinator-Example/Coordinators/UserListCoordinator.swift @@ -31,12 +31,12 @@ class UserListCoordinator: NavigationCoordinator { switch route { case .home: let viewController = HomeViewController.instantiateFromNib() - let viewModel = HomeViewModelImpl(router: unownedRouter) + let viewModel = HomeViewModelImpl(router: self) viewController.bind(to: viewModel) return .push(viewController) case .users: let viewController = UsersViewController.instantiateFromNib() - let viewModel = UsersViewModelImpl(userService: MockUserService(), router: unownedRouter) + let viewModel = UsersViewModelImpl(userService: MockUserService(), router: self) viewController.bind(to: viewModel) return .push(viewController, animation: .fade) case .user(let username): diff --git a/XCoordinator-Example/Scenes/About/AboutViewModelImpl.swift b/XCoordinator-Example/Scenes/About/AboutViewModelImpl.swift index 1b74f7f..1f72ebe 100644 --- a/XCoordinator-Example/Scenes/About/AboutViewModelImpl.swift +++ b/XCoordinator-Example/Scenes/About/AboutViewModelImpl.swift @@ -29,11 +29,11 @@ class AboutViewModelImpl: AboutViewModel, AboutViewModelInput, AboutViewModelOut // MARK: Stored properties - private let router: UnownedRouter + private unowned let router: any Router // MARK: Initialization - init(router: UnownedRouter) { + init(router: any Router) { self.router = router } diff --git a/XCoordinator-Example/Scenes/Home/HomeViewModelImpl.swift b/XCoordinator-Example/Scenes/Home/HomeViewModelImpl.swift index 13759fa..9499d17 100644 --- a/XCoordinator-Example/Scenes/Home/HomeViewModelImpl.swift +++ b/XCoordinator-Example/Scenes/Home/HomeViewModelImpl.swift @@ -34,11 +34,11 @@ class HomeViewModelImpl: HomeViewModel, HomeViewModelInput, HomeViewModelOutput } // MARK: Stored properties - private let router: UnownedRouter + private unowned let router: any Router // MARK: Initialization - init(router: UnownedRouter) { + init(router: any Router) { self.router = router } diff --git a/XCoordinator-Example/Scenes/Login/LoginViewModelImpl.swift b/XCoordinator-Example/Scenes/Login/LoginViewModelImpl.swift index 14360a1..d18f675 100644 --- a/XCoordinator-Example/Scenes/Login/LoginViewModelImpl.swift +++ b/XCoordinator-Example/Scenes/Login/LoginViewModelImpl.swift @@ -24,11 +24,11 @@ class LoginViewModelImpl: LoginViewModel, LoginViewModelInput, LoginViewModelOut // MARK: Stored properties - private let router: UnownedRouter + private unowned let router: any Router // MARK: Initialization - init(router: UnownedRouter) { + init(router: any Router) { self.router = router } } diff --git a/XCoordinator-Example/Scenes/News/NewsViewModelImpl.swift b/XCoordinator-Example/Scenes/News/NewsViewModelImpl.swift index d329ab8..7d2571c 100644 --- a/XCoordinator-Example/Scenes/News/NewsViewModelImpl.swift +++ b/XCoordinator-Example/Scenes/News/NewsViewModelImpl.swift @@ -32,11 +32,11 @@ class NewsViewModelImpl: NewsViewModel, NewsViewModelInput, NewsViewModelOutput // MARK: Stored properties private let newsService: NewsService - private let router: UnownedRouter + private unowned let router: any Router // MARK: Initialization - init(newsService: NewsService, router: UnownedRouter) { + init(newsService: NewsService, router: any Router) { self.newsService = newsService self.newsObservable = .just(newsService.mostRecentNews()) self.router = router diff --git a/XCoordinator-Example/Scenes/User/UserViewModelImpl.swift b/XCoordinator-Example/Scenes/User/UserViewModelImpl.swift index ea1b96b..88d1ed6 100644 --- a/XCoordinator-Example/Scenes/User/UserViewModelImpl.swift +++ b/XCoordinator-Example/Scenes/User/UserViewModelImpl.swift @@ -33,11 +33,11 @@ class UserViewModelImpl: UserViewModel, UserViewModelInput, UserViewModelOutput // MARK: Stored properties - private let router: UnownedRouter + private unowned let router: any Router // MARK: Initialization - init(router: UnownedRouter, username: String) { + init(router: any Router, username: String) { self.router = router self.username = .just(username) } diff --git a/XCoordinator-Example/Scenes/UserList/UsersViewModelImpl.swift b/XCoordinator-Example/Scenes/UserList/UsersViewModelImpl.swift index c787695..4ad7d8e 100644 --- a/XCoordinator-Example/Scenes/UserList/UsersViewModelImpl.swift +++ b/XCoordinator-Example/Scenes/UserList/UsersViewModelImpl.swift @@ -29,11 +29,11 @@ class UsersViewModelImpl: UsersViewModel, UsersViewModelInput, UsersViewModelOut // MARK: Stored properties private let userService: UserService - private let router: UnownedRouter + private unowned let router: any Router // MARK: Initialization - init(userService: UserService, router: UnownedRouter) { + init(userService: UserService, router: any Router) { self.userService = userService self.router = router }