SwiftCurrent is a library that lets you easily manage journeys through your Swift application and comes with built-in support for UIKit and SwiftUI app-routing.
In SwiftCurrent, workflows are a sequence of operations. Those operations usually display views in an application. The workflow describes the sequence of views and manages which view should come next. Your views are responsible for performing necessary tasks before proceeding forward in the workflow, like processing user input.
Architectural patterns and libraries that attempt to create a separation between views and workflows already exist. However, SwiftCurrent is different. We took a new design approach that focuses on:
This library:
Why show a quick start when we have an example app? Because it's so easy to get started, we can drop in two code snippets, and you're ready to go! This quick start uses Swift Package Manager and SwiftUI, but for other approaches, see our installation instructions.
.package(url: "https://github.com/wwt/SwiftCurrent.git", .upToNextMajor(from: "5.1.0")),
...
.product(name: "SwiftCurrent", package: "SwiftCurrent"),
.product(name: "SwiftCurrent_SwiftUI", package: "SwiftCurrent")
Then make your first FlowRepresentable view:
import SwiftCurrent
import SwiftUI
struct OptionalView: View, FlowRepresentable {
weak var _workflowPointer: AnyFlowRepresentable?
let input: String
init(with args: String) { input = args }
var body: some View { Text("Only shows up if no input") }
func shouldLoad() -> Bool { input.isEmpty }
}
struct ExampleView: View, PassthroughFlowRepresentable {
weak var _workflowPointer: AnyFlowRepresentable?
var body: some View { Text("This is ExampleView!") }
}
Then from your ContentView
or whatever view (or app) you'd like to contain the workflow, add the following view to the body:
import SwiftCurrent_SwiftUI
// ...
var body: some View {
// ... other view code (if any)
WorkflowView(launchingWith: "Skip optional screen") {
WorkflowItem(OptionalView.self)
WorkflowItem(ExampleView.self)
}
}
And just like that, you've got a workflow! You can now add more items to it or reorder the items that are there. To understand more of how this works, check out our developer docs.
SwiftCurrent now supports server driven workflows! Check out our schema for details on defining workflows with JSON, YAML, or any other key/value-based data format. Then, simply have your FlowRepresentable
types that you wish to decode conform to WorkflowDecodable
and decode the workflow. For more information, see our docs.
We have example apps for both SwiftUI and UIKit that show SwiftCurrent in action. They've already been tested, so you can see what it's like to test SwiftCurrent code. To run it locally, start by cloning the repo, open SwiftCurrent.xcworkspace
and then run the SwiftUIExample
scheme or the UIKitExample
scheme.
For specific documentation check out:
If you like what you've seen, consider giving us a star! If you don't, let us know how we can improve.
SwiftCurrent would not be nearly as amazing without all of the great work done by the authors of our test dependencies: