Enums in Scheme
On this page
Enumerated Types in Swift
Enumerated types (enums) are a special case of sum types. An enum is a type that has a fixed number of possible values, each with a distinct name. In Swift, enums are a distinct language feature and are very simple to implement.
Our enum type ServerState is defined as follows:
enum ServerState {
case idle
case connected
case error
case retrying
}The possible values for ServerState are defined as cases within the enum.
By implementing the CustomStringConvertible protocol, values of ServerState can be printed out or converted to strings.
extension ServerState: CustomStringConvertible {
var description: String {
switch self {
case .idle:
return "idle"
case .connected:
return "connected"
case .error:
return "error"
case .retrying:
return "retrying"
}
}
}If we have a value of type Int, we cannot pass it to transition - the compiler will complain about type mismatch. This provides some degree of compile-time type safety for enums.
func main() {
let ns = transition(.idle)
print(ns)
let ns2 = transition(ns)
print(ns2)
}transition emulates a state transition for a server; it takes the existing state and returns a new state.
func transition(_ s: ServerState) -> ServerState {
switch s {
case .idle:
return .connected
case .connected, .retrying:
// Suppose we check some predicates here to determine the next state…
return .idle
case .error:
return .error
}
}To run the program, you can put the code in a Swift file and use swift to execute it.
$ swift enums.swift
connected
idleNow that we can run and build basic Swift programs, let’s learn more about the language.