Title here
Summary here
Our enum type ServerState has an underlying int type.
enum ServerState: Int {
case idle = 0
case connected
case error
case retrying
}The possible values for ServerState are defined as constants. The values are automatically assigned starting from 0.
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.
var stateDescription: [ServerState: String] = [
.idle: "idle",
.connected: "connected",
.error: "error",
.retrying: "retrying"
]func transition(_ state: ServerState) -> ServerState {
switch state {
case .idle:
return .connected
case .connected, .retrying:
// Suppose we check some predicates here to determine the next state…
return .idle
case .error:
return .error
default:
fatalError("Unknown state: \(state)")
}
}func main() {
let ns = transition(.idle)
print(ns.description) // connected
let ns2 = transition(ns)
print(ns2.description) // idle
}
main()To run the program, put the code in a Swift file and use swiftc to compile it.
$ swiftc -o enums enums.swift
$ ./enums
connected
idleNow we have a basic understanding of how to use enums in Swift, let’s explore more about the language.