it is sometimes useful to be able to store associated values of other types alongside these case values. This enables you to store additional custom information along with the case value, and permits this information to vary each time you use that case in your code.
In Swift, an enumeration to define product barcodes of either type might look like this:
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
This can be read as:
“Define an enumeration type called Barcode
, which can take either a value of upc
with an associated value of type (Int
, Int
, Int
, Int
), or a value of qrCode
with an associated value of type String
.”
This definition does not provide any actual Int
or String
values—it just defines the type of associated values that Barcode
constants and variables can store when they are equal to Barcode.upc
or Barcode.qrCode
.
New barcodes can then be created using either type:
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
This example creates a new variable called productBarcode
and assigns it a value of Barcode.upc
with an associated tuple value of (8, 85909, 51226, 3)
.
The same product can be assigned a different type of barcode:
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
At this point, the original Barcode.upc
and its integer values are replaced by the new Barcode.qrCode
and its string value. Constants and variables of type Barcode
can store either a .upc
or a .qrCode
(together with their associated values), but they can only store one of them at any given time.
The different barcode types can be checked using a switch statement, as before. This time, however, the associated values can be extracted as part of the switch statement. You extract each associated value as a constant (with the let
prefix) or a variable (with the var
prefix) for use within the switch
case’s body:
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).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."
If all of the associated values for an enumeration case are extracted as constants, or if all are extracted as variables, you can place a single var
or let
annotation before the case name, for brevity:
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print("UPC : (numberSystem), (manufacturer), (product), (check).")
case let .qrCode(productCode):
print("QR code: (productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."