Swiftpack.co - Package - clmntcrl/swidux-router


Router driven by Swidux store.


This library should be considered alpha, and not stable. Breaking changes will happen often.


Declare your routes:

extension Route {
    static let home = Route(type: HomeViewController.self)
    static let product: (Id<Product>) -> Route = { Route(type: HomeViewController.self, routeParam: $0) }
    // ...

Prepare your Swidux store defining initial route:

struct AppState {
    var root = RootDescriptor(initialRoute: .home)
    // ...

let store = Store(
    initialState: AppState(),
    reducer: .combine(reducers: [
        // ...

Make your view controllers Routable or ParametricRoutable if it depends on parameters (for exemple a product page depend on a product id).

class HomeViewController: Routable {/* ... */}

class ProductViewController: ParametricRoutable {
    var routeParam: Id<Product>!
    // ...

Init your Router and add it to the view controller hierarchy:

class AppDelegate: UIResponder, UIApplicationDelegate {
    let window = UIWindow()

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        window.rootViewController = Router(
            store: store,
            keyPath: \.root
        return true

In order to route to new screens use store.dispatch with one of the following route action:

enum RouteAction: Action {
    case present(Route)
    case push(Route)
    case back
    case backToRoot
    case backTo(Route)
    case reset(RootDescriptor)



Add the following dependency to your Cartfile:

github "clmntcrl/swidux-router" ~> 0.1.5
$ carthage update

You should encounter an issue (something like Dependency "swidux-router" has no shared framework schemes) because libraries using SwiftPM are not currently supported by Carthage. This can be resolved with the following:

$ (cd Carthage/Checkouts/swidux-router && swift package generate-xcodeproj --xcconfig-overrides xcode.xcconfig)
$ carthage build swidux-router


Add package as dependency:

import PackageDescription

let package = Package(
    name: "AwesomeProjectNameFramework",
    dependencies: [
        .package(url: "https://github.com/clmntcrl/swidux.git", from: "0.1.1"),
        .package(url: "https://github.com/clmntcrl/swidux-router.git", from: "0.1.5"),
    targets: [
        .target(name: "AwesomeProjectName", dependencies: ["Swidux", "SwiduxRouter"])

Because SwiduxRouter use UIKit you need to create a xcode.xcconfig containing:

SUPPORTED_PLATFORMS = iphoneos iphonesimulator

It override default configuration when generating xcodeproj:

$ swift package generate-xcodeproj --xcconfig-overrides xcode.xcconfig

Then create an iOS app target AwesomeProjectName and scheme. Add AwesomeProjectNameFramework as embedded binary, that's it.

Known issues

  • Missing support for UITabBarController
  • SwiftPM support is a bit tricky because we cannot add dependency on UIKit


SwiduxRouter is released under the MIT license. See LICENSE for details.


Stars: 0
Help us keep the lights on



0.1.5 - Nov 30, 2018

Fix issue where nothing happen when presented route dispatch reset, backToRoot or backTo action

0.1.4 - Nov 28, 2018

  • Remove RouteAction associated property name.
  • Rename RootDescriptor presenting property presented to be sync with UIKit naming (see UIViewControllerTransitioningDelegate)

0.1.3 - Nov 27, 2018

Add support for present(route:) action.

Breaking change: Initial route is now defined in RootDescriptor which contains route stack (see README and Playground for more details)

0.1.2 - Nov 10, 2018

Define initial route in Swidux store initial state.

0.1.1 - Oct 31, 2018