enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
Здесь чистые значения для перечисления под названием ASCIIControlCharacter заданы в тип Character
и установлены в наиболее общие управляющие символы ASCII.
Planet
с чистыми целыми значениями для представления порядка каждой планеты относительно солнца:
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
В примере Planet.mercury
имеет явное чистое значение 1, а Planet.venus
имеет неявное чистое значение 2 и так далее.
CompassPoint
с чистыми строковыми значениями для репрезентации имени каждого направления:
enum CompassPoint: String {
case north, south, east, west
}
В примере выше CompassPoint.south
имеет неявное значение "south" и так далее.
rawValue
:
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
let earthsOrder = Planet.earth.rawValue
// earthsOrder равен 3
enum CompassPoint: String {
case north, south, east, west
}
let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection равен "west"
rawValue
) и возвращает либо соответствующий кейс перечисления, либо nil
. Вы можете использовать этот конструктор для попытки создания нового экземпляра перечисления.
let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet имеет тип Planet? и равен Planet.uranus
В этом примере создаётся Уран из чистого значения 7.
Int
имеют совпадающую планету. Ввиду этого конструктор из чистого значения всегда возвращает кейс перечисления в виде опционала. В примере выше possiblePlanet
имеет тип Planet?
или "опциональная Planet."
Planet
, возвращённое из конструктора чистого значения будет равно nil
.
let positionToFind = 11
if let somePlanet = Planet(rawValue: positionToFind) {
switch somePlanet {
case .earth:
print("Сильно загрязнена")
default:
print("Небезопасное место для людей")
}
} else {
print("Не существует планет на позиции \(positionToFind)")
}
// Выводит "Не существует планет на позиции 11"
Этот пример использует опциональное связывание для попытки доступа к планете с чистым значением 11. Инструкция if let somePlanet = Planet(rawValue: positionToFind)
создаёт опционал типа Planet
и устанавливает somePlanet
в значение этого опционала, если оно может быть получено. В этом случае не может быть платы с позицией 11, так что вместо этого будет выполнена ветвь else
.
indirect
перед ним, что скажет компилятору вставить нужный уровень индирекции.
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
indirect
перед началом всего перечисления, чтобы включить индирекцию для всех кейсов перечисления, для которых это нужно.
addition
и multiplication
имеют ассоциированные с ними значения, которые тоже являются арифметическими выражениями - эти ассоциированные выражения позволяют вкладывать выражения. Например, выражения (5 + 4) * 2 имеет число на правой стороне умножения и другое выражение на левой стороне умножения. Так как данные вложены, то перечисления используется для хранения данных, также нужных для поддержания вложения - это означает, что перечислению нужно быть рекурсивным. Код ниже демонстрирует ArithmeticExpression
- рекурсивное перечисление, созданное для (5 + 4) * 2.
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
func evaluate(_ expression: ArithmeticExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(left, right):
return evaluate(left) + evaluate(right)
case let .multiplication(left, right):
return evaluate(left) * evaluate(right)
}
}
print(evaluate(product))
// Выводит "18"
Эта функция вычисляет обычное число, просто возвращая ассоциированное значение. Оно вычисляет сложение или вычитание, вычисляя выражение на левой стороне, вычисляя выражение на правой стороне, а затем складывая или перемножая их.