Видеокурсы по изучению языка программирования Swift. Подробнее

Исходные значения

Если вы нашли опечатку в тексте, выделите ее и нажмите CTRL + ENTER.

В примере с Barcode в главе “Связанные значения” можно увидеть как кейсы перечисления могут объявлять значения различных типов, которые они могут хранить. Как альтернатива связанным значениям, кейсы перечисления могут иметь начальные значения (называются “исходными значениями”), которые всегда одного типа.

Вот пример перечисления, члены которого хранят исходные значения ASCII, прописанные рядом:

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

Исходные значения перечисления ASCIIControlCharacter определены как тип Character, и им присвоены распространенные контрольные символы ASCII, которые описаны в разделе “Строки и символы”.

Исходные значения могут быть строками, символами или любым целым числом или числом с плавающей точкой. Каждое исходное значение должно быть уникальным при его объявлении. 

Заметка

Исходные значения - это не тоже самое, что ассоциативные значения. Исходные значения установливаются в качестве дефолтных значений, когда вы в первый раз определяете перечисление в вашем коде, как три ASCII кода выше. Исходное значение для конкретного кейса перечисления всегда одно и то же. Ассоциативные значения устанавливаются при создании новой константы или переменной, основываясь на одном из кейсов перечисления, и могут быть разными каждый раз, когда вы делаете это.

Неявно установленные исходные значения

Когда вы работаете с перечислениями, которые хранят целочисленные или строковые исходные значения, вы не нужно явно присваивать исходные значения для каждого конкретного кейса. Swift автоматически сделает это за вас.

Например, когда целые числа используются в качестве исходных значений, неявное значение для каждого кейса будет на единицу больше, чем в предыдущем кейсе. Если первый кейс не имеет заданного значения, его значение равно 0.

Перечисление ниже представляет собой уточнение ранее указанного перечисления 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:

let earthsOrder = Planet.earth.rawValue
// значение earthsOrder равно 3
 
let sunsetDirection = CompassPoint.west.rawValue
// значение sunsetDirection равно "west"

Инициализация через исходное значение

Если вы объявили перечисление вместе с типом исходного значения, то перечисление автоматически получает инициализатор, который берет значение типа исходного значения (как параметр rawValue) и возвращает либо член перечисления либо nil. Вы можете использовать этот инициализатор, чтобы попытаться создать новый экземпляр перечисления.

В этом примере Uranus инициализируется через его исходное значение 7:

let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet имеет тип Planet? и его значение равно Planet.uranus

Конечно не все возможные значения Int найдут отклик в данном перечислении. Из-за этого инициализаторы исходных значений всегда возвращают опциональный член перечисления. В этом примере possiblePlanet типа Planet? или “опциональный Planet”.

Заметка

Инициализатор исходного значения - проваливающийся инициализатор, потому как не каждое исходное значение будет возвращать кейс перечисления. Более подробно см. Проваливающиеся инициализаторы.

Если вы попытаетесь найти планету с номером позиции 11, то значение опциональной Planet, возвращенное исходным значением инициализатора, будет nil:

let positionToFind = 11
if let somePlanet = Planet(rawValue: positionToFind) {
    switch somePlanet {
    case .earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
    }
} else {
    print("There isn't a planet at position \(positionToFind)")
}
// Выведет "There isn't a planet at position 11"

Этот пример использует привязку опционалов для попытки добраться до Planet с исходным значением 11. Выражение if let somePlanet = Planet(rawValue: 11) создает опциональную Planet и устанавливает значение somePlanet опциональной Planet, если она может быть восстановлена. В этом случае невозможно добраться до планеты с позицией 11, таким образом срабатывает ветка else.

 

Swift: 
4.0