What is a Workflow?
Workflow is a description for a sequence of
FlowRepresentables. Those operations normally display screens or views. There are different ways of creating workflows in SwiftUI and creating workflows in UIKit.
What Is a
FlowRepresentable is a protocol that describes a type that can appear in a
Workflow. It optionally declares
FlowRepresentable.WorkflowOutput, indicating if it requires data or passes data forward. It also provides an initializer so that it can be created by the
Workflow. Once an item conforms to
FlowRepresentable, it can be injected into any
Valid Workflow Sequences
Workflows enforce (either at compile-time or run-time) that the sequence of
FlowRepresentables is well-formed. For example, if a particular
FlowRepresentable has a
String, but the previous item passes an
Int forward, that workflow is malformed. A
FlowRepresentable can declare a
Never if it does not take in data,
Any if it can intake multiple types, or
AnyWorkflow.PassedArgs if it can handle being passed no data, or data of any kind. Lastly, if your
FlowRepresentable.WorkflowInput needs to take in multiple values, you can use a tuple.
In some cases, like UIKit, the compiler is efficient enough to give you compile-time feedback if a workflow is malformed. This means that run-time errors are rare. They can still occur; for example, if you have Item1 declare a
AnyWorkflow.PassedArgs, then call
.args("string"), but Item2 has a
Int, there’ll be a run-time error because the data passed forward does not meet expectations.
In SwiftUI, the compiler was not efficient enough to give the same compile-time feedback on malformed workflows. When that safety was added, the compiler only allowed for small workflows to be created. To combat this, SwiftUI is heavily run-time influenced. When you create a
WorkflowLauncher, the launcher performs a run-time check to guarantee the workflow is well-formed. This means that if you wanted to test your workflow was well-formed, all you have to do is instantiate a