Enumeration type is a common type in many programming languages, which normally presents a set of limited status for a program, such as list all the directions for a compass:
enum CompassPoint {
case north
case south
case east
case west
}
However, enum
provides more features than that:
1. Static values
enum
is often to be used as type constants.
For example, we have three product types, now we have a ProudctType
which contains all the types, so we can use that ProudctType
as constant value anywhere in the project. The benefits of doing such is all the product type in one place and they can be accessed through .
:
enum ProudctType {
static let limtedOffer = "Limted Offer"
static let onGoingOffer = "On-going Offer"
static let tempOffer = "Temporary only Offer"
}
print(PersonTypes.limtedOffer) // Limted Offer
2. Enumerations with raw values
Unlike objective-c and many other programming languages, enumeration cases in Swift don't have an integer value by default, but we can always assign a custom value to it.
enum ProductType: String {
case limtedOffer = "Limted Offer"
case onGoingOffer = "On-going Offer"
case tempOffer = "Temporary only Offer"
}
// We can also retrieve the enum type via the raw value, it will return nil if no matches
let productType = productType(rawValue: "Limted Offer")
3. Enumerations with associated values
Associated values allow us to pass values from definition.
// Example is from the Swift doc
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
print("QR code: \(productCode).")
}
4. Can't use stored properties
enum MyError: Error {
var error1: String = "error 1"
}
// ERROR: throw out enums must not contain stored properties.
// To fix this error, we can use a computed property here:
enum MyError: Error {
var error1: String {
get {
return "error 1"
}
}
}
5. All cases needed to be iterated with switch
It is recommended by the compiler in many other programming languages that we need to list all the cases while doing switch. However it is mandatory in swift:
enum MyError: Error {
case error1
case error2
case error3
}
// Example 1:
let err = MyError.error1
switch err {
case .error1:
print("Error 1")
case .error2:
print("Error 2")
}
// ERROR: Switch must be exhaustive.
// In order to fix this we need either:
// Having all the enum types, see example 2, or
// Using a break
// Example 2:
switch err {
case .error1:
print("Error 1")
case .error2:
print("Error 2")
case .error3:
print("Error 3")
}
// Example 3:
switch err {
case .error1:
print("Error 1")
case .error2:
print("Error 2")
default:
break
}